2016-06-26 14 views
4

SMLでOption Monadを実装したいので、それらをhaskellで使用するのと同じ方法で使用できます。私がしたことはうまくいかない。SMLオプションMonad(バインド演算子が動作しない)

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.>>= 

私は最後の行を動作させるために何ができますか?

+2

は1 [ソリューション](http://stackoverflow.com/a/です:あなたは、右の各fnをparenthesiseする必要があるためこれは、ラムダと>>=の連鎖いくつかの用途に、それはやや面倒になります14129095/2747511) - 単に 'optionM'を開きます。 –

+1

または 'val op >> = = OptionM。>> ='。 –

答えて

6

ハスケルとは異なり、修飾された中置演算子(A.+またはなど)はSMLの中置ではありません。あなたはそれらを無資格で使用する必要があります。モジュールを開くか、ローカルに再バインドしてください。

Btwの場合、>>=を右結合として定義することをお勧めします。つまり、infixrを使用します。

また、SMLはHaskellよりも厳しい優先ルールを持っています。ここで

foo >>= (fn x => bar >>= (fn y => baz >>= (fn z => boo))) 
+2

[標準ML(改訂版)の定義](http://sml-family.org/sml97-defn.pdf)、§2.6: "(修飾された識別子にはインミックスステータスがないことに注意してください) –