次のように定義される遅延評価シーケンスを定義する構造があります。
datatype 'a seq = Cons of 'a option * (unit -> 'a seq)
そして、型 ('a->'b) の関数をシーケンス内の値にマップする関数 map() があります。
val map : ('a -> 'b) -> 'a seq -> 'b seq
ただし、関数を定義すると、署名によって提供される型と一致せず、一致させる方法を一生理解できません。私が試したことはすべて、影響を与えなかったか、さらに悪化させました。
fun map fu (Cons(NONE, f)) = map fu (f())
| map fu (Cons(SOME x, f)) = Cons(fu(x), fn () => map(fu) (f()))
これにより、構造のエラータイプが署名と一致しません
spec: ('a -> 'b) -> 'a ?.Seq.seq -> 'b ?.Seq.seq
actual: ('a -> 'b option) -> 'a ?.Seq.seq -> 'b ?.Seq.seq