inf*_*fal 4 monads bind operators sml
我想在SML中实现Option Monad,所以我可以像在haskell中使用它们一样使用它们.我做了什么,不起作用.
infix 1 >>=
signature MONAD =
sig
type 'a m
val return : 'a -> 'a m
val >>= : 'a m * ('a -> 'b m) -> 'b m
end;
structure OptionM : MONAD =
struct
type 'a m = 'a option
val return = SOME
fun x >>= k = Option.mapPartial k x
end;
val x = OptionM.return 3;
x (OptionM.>>=) (fn y => NONE);
Run Code Online (Sandbox Code Playgroud)
结果:
stdIn:141.1-141.31 Error: operator is not a function [tycon mismatch]
operator: int OptionM.m
in expression:
x OptionM.>>=
Run Code Online (Sandbox Code Playgroud)
我该怎么做才能使最后一行有效?
与Haskell不同,合格的中缀运算符(例如A.+或Option.>>=)不是SML的中缀.您需要使用它们不合格,例如通过打开模块或在本地重新绑定它.
顺便说一句,你可能想要定义>>=为右关联,即使用infixr.
此外,SML具有比Haskell更严格的优先级规则.这将使用>>=lambdas 链接的几个用法变得有点繁琐,因为你必须fn在右边的每个用词括号:
foo >>= (fn x => bar >>= (fn y => baz >>= (fn z => boo)))
Run Code Online (Sandbox Code Playgroud)