我是OCaml的新手,試圖將List.append
作爲學習練習。這是我有:List.rev表現奇怪嗎?
let rec append a b =
match (List.rev a) with
[] -> b
| x:: xs -> append xs (x::b)
這似乎是工作,直到說法a
有兩個以上的元素。例如:
# append [1;2] [3;4]
- : int list = [1; 2; 3; 4]
# append [1;2;3] [4;5;6]
- : int list = [2; 1; 3; 4; 5; 6]
這是怎麼回事嗎?我查過了,List.rev [1;2;3]
返回int list = [3; 2; 1]
。我知道我的實現是天真的,而不是懶惰的,但它似乎應該工作。
你使用'ocamldebug'調試器嗎?你是否查看了* Ocaml *(在'ocaml-3.12/stdlib/list.ml'中)代碼爲'List.rev'的源代碼[free as in speech]? – 2012-03-06 19:23:17
我現在在調試器中,但沒有看到任何明顯的線索。我確實查看了源代碼並確信自己「List.rev」的實現應該像我期望的那樣工作。你有其他想法嗎? – Pygmalion 2012-03-06 19:30:35
在你的'append'或一些打印內容的開始處放置一個斷點。 – 2012-03-06 19:34:01