0

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

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
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 回答