2017-01-25 25 views
0

我工作的一個版本,這是這裏的問題: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,所以我不確定什麼是正確的方向。

預先感謝您!

+2

不要只鏈接到頁面;包括你需要的任何環境(但不要再多!)來解釋問題本身的問題。 – chepner

+0

'chop [1,0,0,0]'用於切斷一個第一級別的頭,這會導致代碼中寫入[[0,0,0]]。 – rampion

回答

1

我認爲你誤解了預期的行爲。 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)表達式所做的,我認爲這將是一個錯誤。)