0

次のように定義される遅延評価シーケンスを定義する構造があります。

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
4

1 に答える 1

0

一瞬後、私は問題を解決したと思います。Consがオプションを取ったので、そのようにタイプされていることにようやく気付きました。これが私の解決策です

fun map fu (Cons(NONE, f)) = map fu (f())
  | map fu (Cons(SOME x, f)) = Cons(SOME(fu(x)), fn () => map(fu) (f()))
于 2013-04-27T20:05:16.597 に答える