gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 23:04:41 24 4
gpt4 key购买 nike

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com