Monads/Maybe monad: Difference between revisions

no edit summary
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>
 
19

edits