我有一个结构来定义延迟评估的序列,定义为
datatype 'a seq = Cons of 'a option * (unit -> 'a seq)
我有一个函数map(),它将类型('a->'b)的函数映射到序列中的值。
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
答案 0 :(得分:0)
一个AH时刻之后,我想我解决了这个问题。我终于意识到它是这样输入的,因为Cons采取了一种选择,并且出于某种原因,尽管看了很多次,我甚至没有想到这一点。这是我的解决方案
fun map fu (Cons(NONE, f)) = map fu (f())
| map fu (Cons(SOME x, f)) = Cons(SOME(fu(x)), fn () => map(fu) (f()))