我收到以下摺疊的類型錯誤,我真的不知道如何解決它...任何人都可以告訴我我在這裏失蹤了什麼?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