我收到以下折叠的类型错误,我真的不知道如何解决它...任何人都可以告诉我我在这里失踪了什么?OCaml类型错误(折叠)
List.fold_left = (fun acc y -> ((fst acc +1), x)::acc) [(0,0)] [1;2;3]
这里的想法是获得[(index,content)]
作为返回值。 对于[1;2;3]
,它将是[(3,3);(2,2);(1,1);(0,0)]
。
我收到以下折叠的类型错误,我真的不知道如何解决它...任何人都可以告诉我我在这里失踪了什么?OCaml类型错误(折叠)
List.fold_left = (fun acc y -> ((fst acc +1), x)::acc) [(0,0)] [1;2;3]
这里的想法是获得[(index,content)]
作为返回值。 对于[1;2;3]
,它将是[(3,3);(2,2);(1,1);(0,0)]
。
你的代码有太多的错误,甚至得到一个类型错误!
这里是前几个错误,我看到:
在你的代码的=
是一个比较操作。最终你会得到一个类型错误。很可能你只是想放弃=
。这就像是写sin = x
而不是sin x
。
标识符x
未在您的代码中任何地方定义。
您的累计值是一个列表,所以您不能将fst
应用于它。
在修复这些,你可能会开始得到类型错误:-)
谢谢。看起来我还有很长的路要走。嗯... x应该是y和(错误的错字..)“=”可以很容易地修复。但对于(3),我认为列表的每个元素都应用于该函数,所以我认为fst可以应用(因为列表元素是())。是否可以修改列表中的()内的值?除了pst和fst之外,找不到模块来做这样的事情:( – Dmitri 2014-09-20 21:48:59
)你不能在OCaml中修改列表或对,它们是不可变的,但是你当然可以*访问你想要的值,如果你知道列表是永远不会空(因为它永远不会在你的示例代码中),你可以使用'List.hd'来获得第一个元素,然后你可以应用'fst'。 – 2014-09-20 22:06:01
您需要两位的信息传递给折叠过程:
有了这个想法,你的函数的一个可能的修正:
let decorate lst =
List.fold_left (fun (acc, index) y -> ((y, index)::acc, index+1)) ([],1) lst
|> fst
# decorate [1; 2; 3];;
- : (int * int) list = [(3, 3); (2, 2); (1, 1)]
你的问题是关于一个错误信息,你甚至不提供确切的错误信息。 – 2014-09-20 21:42:34
我会记住这一点。谢谢。 – Dmitri 2014-09-20 22:02:25