问题匹配功能类型与签名中定义的功能类型

时间:2013-04-27 18:49:03

标签: sml smlnj

我有一个结构来定义延迟评估的序列,定义为

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

1 个答案:

答案 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()))