これがあなたが求めていたものかどうかはわかりませんが、他のリストに依存せずに、増加する自然数のリストを作成したかったように思えます。したがって、そのトークンによって、次のようなことができます
incr a = a : inrc (a+1)
lst = inrc 1
take 3 lst
=> [1,2,3]
lst
技術的には、これは累積関数と呼ばれ (私は信じています)、「 」で簡単に使用できる特別なケースを作成するだけです。
そこから気が狂って、次のようなことをすることができます:
lst = 1 : incr lst where incr a = (head a) + 1 : incr (tail a)
take 3 lst
=> [1,2,3]
など、それはおそらくあなたがまだ学んだことのないいくつかのものに依存していますが(どこで)-OPから判断すると-それでもかなり簡単に読めるはずです.
そうそう、それからリストの乗算です。さて、zipWith (*)
上記のように使用することも、このように車輪を再発明することもできます (もっと楽しいです、私を信じてください:)
lmul a b = (head a * head b) : lmul (tail a) (tail b)
safemul a b
| null a || null b = []
| otherwise
= (head a * head b) : safemul (tail a) (tail b)
の理由はsafemul
、関数 を試してみればわかると思いますがlmul
、' tail
' (および ' head
' も同様) に関係しています。問題は、空のリスト、不一致のリストなどのケースがないため、lmul
さまざまな定義を一緒にハックする ( lmul _ [] = []
) か、ガードなどを使用するかwhere
、または に固執する必要があることですzipWith
。 )