我想在 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/

10-10 13:29