Monads/Maybe monad: Difference between revisions
no edit summary
Thundergnat (talk | contribs) m (syntax highlighting fixup automation) |
No edit summary |
||
Line 1,645:
Maybe.unit(nil).bind { |n| Maybe.unit(2*n) }.bind { |n| Maybe.unit(n+1) }
#=> #<Maybe @value=nil>
</syntaxhighlight>
=={{header|Swift}}==
{{works with|Swift|5}}
<syntaxhighlight lang="Swift">
precedencegroup MonadPrecedence {
higherThan: BitwiseShiftPrecedence
associativity: left
}
infix operator >>-: MonadPrecedence // Monadic bind
typealias Maybe = Optional
extension Optional
{
public static func unit(_ x: Wrapped) -> Wrapped?
{
return Optional(x)
}
public func bind<T>(_ f: (Wrapped) -> Optional<T>) -> Optional<T>
{
return flatMap(f)
}
public static func >>- <U>(_ m: Optional<Wrapped>, _ f: (Wrapped) -> Optional<U>) -> Optional<U>
{
return m.flatMap(f)
}
}
func dividedBy2IfEven(_ x: Int) -> Int?
{
x.isMultiple(of: 2) ? x / 2 : nil
}
func lineOfAs(_ x: Int) -> String?
{
guard x >= 0 else { return nil }
let chars = Array<Character>(repeating: "A", count: x)
return String(chars)
}
print("\(Maybe.unit(4).bind(dividedBy2IfEven).bind(lineOfAs) ?? "nil")")
print("\(Maybe.unit(4) >>- dividedBy2IfEven >>- lineOfAs ?? "nil")")
print("\(Maybe.unit(3) >>- dividedBy2IfEven >>- lineOfAs ?? "nil")")
print("\(Maybe.unit(-4) >>- dividedBy2IfEven >>- lineOfAs ?? "nil")")
</syntaxhighlight>
|