リストのスライス

Prelude> [1..5]
[1,2,3,4,5]

こんなリストさんで試す。
先頭n個を取りたいときはtakeを使うとあった。

Prelude> take 3 [1..5]
[1,2,3]

うん。わかる。

Prelude> 1:2:3:4:5:[]
[1,2,3,4,5]

これもおなじことなので、

Prelude> take 3 1:2:3:4:5:[]

:1:16:
    No instance for (Num [a0])
      arising from the literal `5'
    Possible fix: add an instance declaration for (Num [a0])
    In the first argument of `(:)', namely `5'
    In the second argument of `(:)', namely `5 : []'
    In the second argument of `(:)', namely `4 : 5 : []'

あるぇー?おなじじゃない模様。なんなの?
もしかして、と思い、遅延評価?だかをするみたいな風情の$を使ってみる。

Prelude> take 3 $ 1:2:3:4:5:[]
[1,2,3]

はーなるほどー。
で、

Prelude> take 3 [1..5]
[1,2,3]

先ほどこれはできたわけだがこっちはどうかなと試すと、

Prelude> take 3 $ [1..5]
[1,2,3]

同じなんだ。$は「右端まであるカッコ」だという記述があったので、つまりそれは、

Prelude> take 3 ([1..5])
[1,2,3]

はーなるほど。
さっきのエラー文言そのものをみてみる。おかしいと言っているのは16桁目、「5」のあたり。
「リテラル「5」から発生するための(Num[a0])インスタンスはありません。」
エキサイト様すいません、わかんないっす。

Possible fix: add an instance declaration for (Num [a0])

こっちは修正すべき箇所の指示かな。
「実例宣言を加える、のために(Num[a0])」
インスタンスの宣言を加えろ?Num [a0]ってのがよくわからない。
リストを処理しようとしたけど、数値リテラルだったからやーめた、という解釈をしてみます。

take 3する時点では、1:2:3:4:5:[]は1から5のリテラルと空リストの連なった何かであってそれはリストじゃないんだよと言われているのでしょうか。
で、

(1:2:3:4:5:[])

と書いたことで

[1,2,3,4,5]

に置き換わって、先頭3つをスライスできるようになりました、めでたし的なかんじ?

Prelude> 1:2:3:4:5:[] == [1..5]
True

うーん、よくわからない。わからんが、take 3さんに1:2:3:4:5:[]を渡しても駄目であるということは分かった。
それを分かったというのかというと、ちょっと微妙な気はしますが。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です