あなたの関数は、いくつかの問題があります。
te (x:xs) f c = ...
はほぼあらゆる可能性をマッチするパターンです:最初の引数を持つすべての呼び出しは、非ています空リストは一致し、残りの句は決して「発火」しません。これらは第1節のサブセットパターンであるためです。
- 最初の句を取るときに、増加しているリストで再帰を実行します。 (最初の項目のために)基本ケースに入る方法はありませんが、最終的にはメモリが足りなくなります。
いくつかの奇妙な(間違っていないですが、効率的でエレガントではない)あなたの機能を持つものもあります。
- あなたは
te
機能でf
とc
を使用しますが、これらは常に同じを持っているが、値;
w > 0
,w < 0
とw == 0
と比較してください。それ以外の場合は、値がそれ以上ではなく、等しくないことがないため、これは奇妙です。
おそらく、私たちは最初に描画ボードに戻る必要があります。我々は機能we
を定義し、我々は3例を区別:
we w | w > 0 = ...
| w == 0 = ...
| otherwise = ...
明らかに(これはあなたが投稿の仕様ではありません)、私たちはw < 0
にエラーすべき、とリターンの最初のステップは、良いもの、多かれ少なかれです場合w
では空リストはそう、ゼロに等しいです:
we w | w > 0 = ...
| w == 0 = []
| otherwise = error "w is less than zero"
は今w > 0
のために、我々は他の何かが続い0
で始まるリストを生成しますので、私たちは書くことができます知っている:
we w | w > 0 = 0 : ...
| w == 0 = []
| otherwise = error "w is less than zero"
したがって、0
を先頭にしてリスト(_:_)
を作成します。今、残りは(例えばte
用)再帰関数の呼び出しです:n > 0
、私たちは「はを発する」n
、およびデクリメントに再帰を行う、その場合には:
we w | w > 0 = 0 : te w
| w == 0 = []
| otherwise = error "w is less than zero"
where te n = ...
今te
のために2つの可能性がありますn
;またはケースn <= 0
には、我々は(私たちは空のリストを生成)終了:
we w | w > 0 = 0 : te w
| w == 0 = []
| otherwise = error "w is less than zero"
where te n | n > 0 = n : te (n-1)
| otherwise = []
と、それはそれです!
よく、最初のパターンの 'te'は常に一致するので、* list *を大きくしておきます。 –
どのように再帰を止めることができますか?f 0 0 cと0 0 – EStudent
底部の代わりに 'te'定義の最上位を指定します。それは "最も特定の機能が呼び出される" Javaのようなものではありません。ハスケルは、これらの火災の1つが発生するまで、上から下に句を概念的に評価する。 –