はのエラーメッセージが言っている正確に何を見てみましょう。
map (take 3) [1, 2, 3, 4, 5]
map
の型シグネチャは
map :: (a -> b) -> [a] -> [b]
だから、a
からb
に関数を取り、[a]
から[b]
に関数を返しています。あなたの場合、関数はtake 3
です。これはリストを取り、リストを返します。従ってa
とb
はともに[t]
です。したがって、map
の2番目の引数は、リストのリスト[[t]]
でなければなりません。今、Haskellは第2引数を見て、それが数字のリストであることを見ています。だから、「どのようにして数字をリストにすることができますか?」ハスケルはこれを行う良い方法を知らないので、それはどのタイプも知らないと文句を言う。Num [t]
。
は今、あなたがする何を意味するのかについては、私はそれがコメントで言及されたと考えています。 tails
関数はリストを取り、そのリストのすべてのテールのリストを返します。したがって
tails [1, 2, 3, 4, 5]
-- ==> [[1, 2, 3, 4, 5], [2, 3, 4, 5], [3, 4, 5], [4, 5], [5], []]
ここで、各引数にtake
関数を適用できます。
map (take 3) (tails [1, 2, 3, 4, 5])
-- ==> [[1, 2, 3], [2, 3, 4], [3, 4, 5], [4, 5], [5], []]
私たちは欲しくないいくつかの付加価値を持っています。その中に3つの要素を持つ値だけが必要です。だから、フィルタを私たちが望むものから外しましょう。 filter
は、述語(ブール値を返す関数)とリストを返すだけで、述語を満たす要素のみを含むリストを返します。述語はリストを取り、またはそのリストには3つの要素があります。
\x -> ... -- We want only the lists
\x -> length x ... -- whose length
\x -> length x == 3 -- is exactly equal to 3
だから、私たちの関数のではない。今は。
filter (\x -> length x == 3) (map (take 3) (tails [1, 2, 3, 4, 5]))
-- ==> [[1, 2, 3], [2, 3, 4], [3, 4, 5]]
filter
には、[1]あなたが取得するimport Data.List
する必要があるかもしれないことに注意することを渡しますtails
機能。
'マップ(3テイク)(テイク3(尾は、[1,2,3,4,5]))' – 4castle
待ち時間は、ここで何が起こっているのですか? –
'map'は、サブリストではなく、マッピング関数の各呼び出しに一度に1つの項目だけを渡します。私のコードでは、最初の3つのサブリストを取得するために 'tail 3'と' take 3 'を使います。 – 4castle