operators - SML 选项 Monad(绑定(bind)运算符不起作用)

标签 operators bind monads 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);

结果:

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 选项 Monad(绑定(bind)运算符不起作用),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38041054/

相关文章:

python - 如果既不是按位运算也不是 print chevron,>> 是做什么的?

jquery - 如何避免 jQuery on() 方法绑定(bind)两次?

scala - 如果使用 cats IO 选项为 None,如何停止 for-compression 的执行?

list - 为什么要按这个顺序列出 monad?

javascript - 通过引用分配 var - JavaScript

python - `getattr` 与 `object.__getattribute__` 和 `object.__getattr__` 有什么关系?

ubuntu - 启动 docker daemon 监听特定端口的正确方法

javascript - 使用 function.bind 将函数绑定(bind)到 this

haskell - IO 操作是否可以在将逻辑保持在纯函数中的同时进行排序?

c++ - 如何覆盖运算符 <