2016-06-26 3 views
4

Я хочу реализовать Option Monad в SML, поэтому я могу использовать их так же, как они могут использоваться в haskell. То, что я сделал, не работает.SML Option 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

Вот один [решение] (http://stackoverflow.com/a/ 14129095/2747511) - просто 'open OptionM'. –

+1

Или 'val op >> = = OptionM. >> ='. –

ответ

6

В отличие от Haskell, квалифицированные операторы infix (такие как A.+ или Option.>>=) не являются инфиксами в SML. Вы должны использовать их неквалифицированными, например. либо путем открытия модуля, либо путем его локализации.

Btw, вы, вероятно, хотите определить >>= как право-ассоциативный, то есть использовать infixr.

Кроме того, SML имеет более строгие правила приоритета, чем Haskell. Это позволит сделать его немного более утомительно цепи несколько применений >>= с лямбды, потому что вы должны parenthesise каждый fn справа:

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

Цитата из [Определение стандартного ML (пересмотренная версия)] (http://sml-family.org/sml97-defn.pdf), §2.6: "(Обратите внимание, что у квалифицированных идентификаторов никогда нет статуса инфикса.)" –

Смежные вопросы