2014-09-20 82 views
-1

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

+1

你的問題是關於一個錯誤信息,你甚至不提供確切的錯誤信息。 – 2014-09-20 21:42:34

+0

我會記住這一點。謝謝。 – Dmitri 2014-09-20 22:02:25

回答

1

你的代碼有太多的錯誤,甚至得到一個類型錯誤!

這裏是前幾個錯誤,我看到:

  1. 在你的代碼的=是一個比較操作。最終你會得到一個類型錯誤。很可能你只是想放棄=。這就像是寫sin = x而不是sin x

  2. 標識符x未在您的代碼中任何地方定義。

  3. 您的累計值是一個列表,所以您不能將fst應用於它。

在修復這些,你可能會開始得到類型錯誤:-)

+0

謝謝。看起來我還有很長的路要走。嗯... x應該是y和(錯誤的錯字..)「=」可以很容易地修復。但對於(3),我認爲列表的每個元素都應用於該函數,所以我認爲fst可以應用(因爲列表元素是())。是否可以修改列表中的()內的值?除了pst和fst之外,找不到模塊來做這樣的事情:( – Dmitri 2014-09-20 21:48:59

+0

)你不能在OCaml中修改列表或對,它們是不可變的,但是你當然可以*訪問你想要的值,如果你知道列表是永遠不會空(因爲它永遠不會在你的示例代碼中),你可以使用'List.hd'來獲得第一個元素,然後你可以應用'fst'。 – 2014-09-20 22:06:01

0

您需要兩位的信息傳遞給摺疊過程:

  1. 累計名單。
  2. 下一個免費索引。

有了這個想法,你的函數的一個可能的修正:

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)]