2017-05-01 4 views
0

と関数合成I次の例を持っていると、彼らは種類が互いにSML:isSome

- isSome; 
val it = fn : 'a option -> bool 


- SOME; 
val it = fn : 'a -> 'a option 
- val my_converter = (fn x => if x = 5 then SOME x else NONE); 
val my_converter = fn : int -> int option 

両方SOMEと対戦か、オプションを返すmy_converterていても動作しませんが、私はやるとき

を次
- fn x => isSome o SOME x; 
stdIn:19.9-19.24 Error: operator and operand don't agree [tycon mismatch] 
    operator domain: ('Z option -> bool) * ('Y -> 'Z option) 
    operand:   ('Z option -> bool) * 'X option 
    in expression: 
    isSome o SOME x 

なぜタイプエラーが発生するのですか?

+0

すべての入力に対して 'isSome o SOME'が' true'を返すので、これを使用する意欲はありません。 –

+0

これは、isSomeと条件付きのSOME/NONEペアをどのように組み合わせるかというより一般的なパターンを示すために使用できる組み込み関数の最も簡単な例です – Har

答えて

1

エラーメッセージは、oにファンクションオペランドが必要ですが、実際にはoptionが得られることを示しています。これは、isSome o SOME xisSome o (SOME x)と解釈されるため意味がありません。

代わり

(isSome o SOME) x 

を書き込むことによってこの問題を解決することができます。