あなたは意図された動作を誤解していると思います。射撃が指摘すると、 chop [1,0,0,0]
は[0,0,0]
になります。私はあなたが[0,3,0,0]
を得るところでは分かりませんが、少し歩いて行きます。
最初にchop
という定義があり、定義の各部分を参照できるようなコメントがあります。
chop [] = [] --chopNull
chop (1:xs) = xs --chopHead1
chop (n:xs) = (replicate (n - 1) (n - 1)) ++ xs --chopHeadN
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]
が適切な開始点です。次に、2つの要素リストに移動します。この例のように、定義の一部を切り抜いて、その部分が既知のデータに対して行っていることを調べることができます。 ghciで自分でやってください。 (実際には、レプリケート(0-1)(0-1)式で行ったことですが、エラーであると思いました)
ページにリンクするだけではありません。質問そのものの問題を説明するために必要な文脈(ただしこれ以上は必要ありません)を含めてください。 – chepner
'chop [1,0,0,0]'は1つの第1レベルの先頭を切り捨てるためのもので、コードに '[0,0,0]'が書かれているはずです。 – rampion