SML选项Monad(绑定运算符不工作)

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)

我该怎么做才能使最后一行有效?

And*_*erg 6

与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)

  • 引自[标准ML的定义(修订版)](http://sml-family.org/sml97-defn.pdf),§2.6:"(注意,合格的标识符永远不会有中缀状态.)" (2认同)