let lostNumbers = [4,8,15,16,23,42]
lostNumbers
[4,8,15,16,23,42]
は
['h','e','l','l','o']`のシンタックスシュガー、文字列はlistなのでlostNumbers' = [4,8,15,16,23,42]
lostNumbers'
[4,8,15,16,23,42]
GHC 8からはghciでもletが不要になった。
[1,2,3,4] ++ [9,10,11,12]
"hello" ++ " " ++ "world"
['w','o'] ++ ['o','t']
[1,2,3,4,9,10,11,12]
"hello world"
"woot"
++
list結合++
の左側のリストを走査するので、大きなリストを扱うときは注意'A':"SMALL CAT"
5:[1,2,3,4,5]
"ASMALL CAT"
[5,1,2,3,4,5]
:
先頭に要素を追加[1,2,3]
は 1:2:3:[]
のシンタックスシュガーNote: []
, [[]]
, [[],[],[]]
は全て異なるものである最初は空リスト、2番目は空リストを含むリスト、最後は3つの空リストを含むリスト
"Steve Buscemi" !! 6
[9.4,33.2,96.2,11.2,23.25] !! 1
'B'
33.2
!!
特定のindexの要素を取りだすlet b = [[1,2,3,4],[5,3,3,3],[1,2,2,3,4],[1,2,3]]
b
b ++ [[1,1,1,1]]
[6,6,6]:b
b !! 2
[[1,2,3,4],[5,3,3,3],[1,2,2,3,4],[1,2,3]]
[[1,2,3,4],[5,3,3,3],[1,2,2,3,4],[1,2,3],[1,1,1,1]]
[[6,6,6],[1,2,3,4],[5,3,3,3],[1,2,2,3,4],[1,2,3]]
[1,2,2,3,4]
[3,2,1] > [2,1,0]
[3,2,1] > [2,10,100]
[3,4,2] > [3,4]
[3,4,2] > [2,4]
[3,4,2] == [3,4,2]
True
True
True
True
True
<
, <=
, >
と >=
辞書的な比較head [5,4,3,2,1]
5
head
先頭要素を返すtail [5,4,3,2,1]
[4,3,2,1]
tail
先頭要素以外のリストを返すlast [5,4,3,2,1]
1
last
末尾要素を返すinit [5,4,3,2,1]
[5,4,3,2]
init
末尾要素以外のリストを返すhead []
tail []
last []
init []
length [5,4,3,2,1]
5
length
リストの長さを返すnull [1,2,3]
null []
False
True
null
リストが空リストの場合 True
を返し、そうで無い場合 False
を返reverse [5,4,3,2,1]
[1,2,3,4,5]
reverse
リストの要素を逆順にして返すtake 3 [5,4,3,2,1]
take 1 [3,9,3]
take 5 [1,2]
take 0 [6,6,6]
[5,4,3]
[3]
[1,2]
[]
take
先頭から指定した数の要素数のリストを返す。0のときは空リストを返すdrop 3 [8,4,2,1,5,6]
drop 0 [1,2,3,4]
drop 100 [1,2,3,4]
[1,5,6]
[1,2,3,4]
[]
drop
先頭から指定した数の要素数を取り除いたリストを返す。指定した数がリストの長さ以上の場合は空リストを返すminimum [8,4,2,1,5,6]
1
minimum
リストの最小値を返すmaximum [1,9,2,3,4]
9
maximum
リストの最大値を返すsum [5,2,1,6,3,2,5,7]
31
sum
リストの要素の和を返すproduct [6,2,1,2]
product [1,2,5,6,7,9,2,0]
24
0
product
リストの要素の積を返す
4 `elem` [3,4,5,6]
10 `elem` [3,4,5,6]
True
False
elem
リストに指定した値が入っている場合 True
を返し、そうで無い場合 False
を返す[1..20]
['a'..'z']
['A'..'Z']
['A'..'z']
[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20]
"abcdefghijklmnopqrstuvwxyz"
"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
"ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz"
[2,4..20]
[3,6..20]
[2,4,6,8,10,12,14,16,18,20]
[3,6,9,12,15,18]
[0.1, 0.3..1]
[0.1,0.3,0.5,0.7,0.8999999999999999,1.0999999999999999]
take 10 (cycle [1,2,3])
take 12 (cycle "LOL ")
[1,2,3,1,2,3,1,2,3,1]
"LOL LOL LOL "
cycle
指定したリストの要素を繰り返す無限listを返すtake 10 (repeat 5)
[5,5,5,5,5,5,5,5,5,5]
repeat
指定した値を繰り返す無限listを返すreplicate 10 5
[5,5,5,5,5,5,5,5,5,5]
take
と repeat
を使う場合、 replicate
関数を用いて簡単に書ける[x*2 | x <- [1..10]]
[2,4,6,8,10,12,14,16,18,20]
[x*2 | x <- [1..10], x >= 6]
[12,14,16,18,20]
[ x | x <- [50..100], x `mod` 7 == 3]
[52,59,66,73,80,87,94]
filtering
できるboomBangs xs = [ if x < 10 then "BOOM!" else "BANG!" | x <- xs, odd x]
boomBangs [7..13]
["BOOM!","BOOM!","BANG!","BANG!"]
[ x | x <- [10..20], x /= 13, x /= 15, x /= 19]
[10,11,12,14,16,17,18,20]
[ x*y | x <- [2,5,10], y <- [8,10,11]]
[16,20,22,40,50,55,80,100,110]
[ x*y | x <- [2,5,10], y <- [8,10,11], x*y > 50]
[55,80,100,110]
let nouns = ["hobo","frog","pope"]
let adjectives = ["lazy","grouchy","scheming"]
[adjective ++ " " ++ noun | adjective <- adjectives, noun <- nouns]
["lazy hobo","lazy frog","lazy pope","grouchy hobo","grouchy frog","grouchy pope","scheming hobo","scheming frog","scheming pope"]
length' xs = sum [1 | _ <- xs]
length' [5,4,2,1]
length' "hello"
4
5
_
と書くremoveNonUppercase st = [ c | c <- st, c `elem` ['A'..'Z']]
removeNonUppercase "Hahaha! Ahahaha!"
removeNonUppercase "IdontLIKEFROGS"
"HA"
"ILIKEFROGS"
let xxs = [[1,3,5,2,3,1,2,4,5],[1,2,3,4,5,6,7,8,9],[1,2,4,2,1,6,3,1,3,2,3,6]]
[ [ x | x <- xs, even x ] | xs <- xxs]
[[2,2,4],[2,4,6,8],[2,4,2,6,2,6]]
[補足]Pythonにもリスト内包表記がある(Haskellを参考にした)