Sml 发出与签名中定义的函数类型匹配的函数

Sml 发出与签名中定义的函数类型匹配的函数,sml,smlnj,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(

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

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

过了一会儿,我想我解决了这个问题。我终于意识到它是这样打字的,因为犯人选择了一个选项,出于某种原因,尽管我看了很多次,我甚至没有想到这一点。这是我的解决办法

fun map fu (Cons(NONE, f)) = map fu (f())
  | map fu (Cons(SOME x, f)) = Cons(SOME(fu(x)), fn () => map(fu) (f()))