我想在 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);
结果:
stdIn:141.1-141.31 Error: operator is not a function [tycon mismatch]
operator: int OptionM.m
in expression:
x OptionM.>>=
我该怎么做才能使最后一行起作用?
最佳答案
与 Haskell 不同,限定的中缀运算符(例如 A.+
或 Option.>>=
)在 SML 中不是中缀。您需要不合格地使用它们,例如通过打开模块或在本地重新绑定(bind)它。
顺便说一句,您可能希望将 >>=
定义为右结合,即使用 infixr
。
此外,SML 具有比 Haskell 更严格的优先级规则。这将使将 >>=
的多个用法与 lambda 链接起来会有些乏味,因为您必须在右侧为每个 fn
加上括号:
foo >>= (fn x => bar >>= (fn y => baz >>= (fn z => boo)))
关于operators - SML Option Monad(绑定(bind)运算符不起作用),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38041054/