我工作的一個版本,這是這裏的問題:http://blog.gja.in/2014/01/functional-programming-101-with-haskell.html#.WIi0J7YrKHo砍九頭蛇在Haskell
但是如果我在劈斬[1,0,0,0]的輸入給予,它應該返回[0,3,0,0]。我嘗試了一下上面網站上提供的代碼,但是我似乎無法弄清楚。我也只是在3-4天前纔開始學習Haskell,所以我不確定什麼是正確的方向。
預先感謝您!
我工作的一個版本,這是這裏的問題:http://blog.gja.in/2014/01/functional-programming-101-with-haskell.html#.WIi0J7YrKHo砍九頭蛇在Haskell
但是如果我在劈斬[1,0,0,0]的輸入給予,它應該返回[0,3,0,0]。我嘗試了一下上面網站上提供的代碼,但是我似乎無法弄清楚。我也只是在3-4天前纔開始學習Haskell,所以我不確定什麼是正確的方向。
預先感謝您!
我認爲你誤解了預期的行爲。 as rampion指出, chop [1,0,0,0]
應導致[0,0,0]
。我不明白,你在哪裏得到[0,3,0,0]
,但我會帶你一點點。
首先,定義了chop
,其中有一些註釋允許我引用定義的每個部分。您在詢問爲chop chop [1,0,0,0]
。這不是有效的代碼。我會假設你的意思是chop (chop [1,0,0,0])
。以此爲出發點,我會進行一些等同推理。也就是說,我將通過替換定義的相關部分來轉換有問題的程序片段。每行都有一個註釋,指示當前行是如何從前一行計算的。
chop (chop [1,0,0,0])
= chop (chop (1:0:0:0:[]) --De-sugaring of List
= chop (chop (1:xs)) --Let xs = 0:0:0:[] = [0,0,0]
= chop (xs) --chopHead1
= chop (0:0:0:[]) --def of xs
= (replicate (0 - 1) (0 - 1)) ++ (0:0:[]) --chopHeadN
= [] ++ (0:0:[]) --From definition of replicate
= (0:0:[]) --From defintion of (++)
= [0,0] --re-sugaring
我做了上面的一些鬆散的事情。值得注意的是,我在評論中將xs
等同於(0:0:0:[])
。這只是爲了清楚說明定義中的模式匹配如何滿足特定的替代。接下來,我使用了chopHeadN
定義來匹配n=0
的情況,因爲它是第一件匹配的事情。你必須相信我關於複製和(++)的定義。
這就是那個特定的呼叫應該做的。但是,通常情況下,如果您不知道某個特定功能的作用,那麼從一些簡單的輸入開始是一個好主意。對於列表,空列表[]
或單身人士,[n]
是很好的起點。然後轉到兩個元素列表。就像在這個例子中一樣,您可以刪除一部分定義並檢查該部分對已知數據的作用。用ghci自己做。 (其實,這就是我爲複製(0-1)(0-1)表達式所做的,我認爲這將是一個錯誤。)
不要只鏈接到頁面;包括你需要的任何環境(但不要再多!)來解釋問題本身的問題。 – chepner
'chop [1,0,0,0]'用於切斷一個第一級別的頭,這會導致代碼中寫入[[0,0,0]]。 – rampion