![]() |
![]() |
![]() |
![]() |
![]() |
目次
名称 | 説明 |
---|---|
Bool | 真偽値です。True と False があります。 |
Char | 文字です。シングルクオートで囲みます。 |
Int | 範囲が決まった整数です。少なくとも (- 229) --- (229 - 1) をカバーします。 |
Integer | 任意精度の整数です。 |
Float | IEEE 単精度の浮動小数点です。 |
Double | IEEE 倍精度の浮動小数点です。 |
関数 | 動作 |
---|---|
ord | 文字を整数に変換する: ord 'a' --> 97 |
chr | 整数を文字に変換する: chr 97 --> 'a' |
isAscii c | c < '\x80' |
isLatin1 c | c <= '\xff' |
isControl c | c < ' ' || c >= '\DEL' && c <= '\x9f' |
isSpace c | c `elem` " \t\n\r\f\v\xA0" |
isUpper | 'A'..'Z' |
isLower | 'a'..'z' |
isAlpha c | isUpper c || isLower c |
isDigit c | c >= '0' && c <= '9' |
isAlphaNum | [a-zA-Z0-9] |
toUpper | [a-z] -> [A-Z] |
toLower | [A-Z] -> [a-z] |
1,2,3 .. のように整数とも浮動小数点とも解釈できるものは、
処理系が文脈に沿って解釈してくれます。
数値の型を明示するには
value :: type_nameとします。 数値は厳密に型付けされていて、異なる型の数値間の演算は出来ません。
Integer は任意精度の整数です。 Int で収まらない整数を表します。
整数型の割り算はエラーになります。 fromIntegral で型が特定されていない数に戻してから計算します。
Prelude> (4 :: Int) / (2 :: Int) -- Error ERROR - Cannot infer instance *** Instance : Fractional Int *** Expression : 4 / 2 Prelude> (fromIntegral (4 :: Int)) / (fromIntegral (2 :: Int)) -- ok, it returns Num 2.0 Prelude> floor $ (fromIntegral (4 :: Int)) / (fromIntegral (2 :: Int)) -- if you need Int 2
分子 % 分母で表します。
Main> 7 % 3 + 9 % 5 62 % 15
実部 :+ 虚部で表します。
Main> (3 :+ 1) + (1 :+ 2) -- (3+1i) + (1+2i)
4.0 :+ 3.0
Main> 2.2 + (fromIntegral (2 :: Integer)) 4.2 Main> 2.2 + (fromIntegral (2 :: Int)) 4.2その他の型変換については Haskell 98 report 6.4.6 を見てください。
2要素の tuple (pair) には、最初の要素を返す fst と
2番目の要素を返す snd があらかじめ定義されています。
Prelude> fst ("I am first", 2) "I am first" Prelude> snd ("I am first", 2) 2ある要素を取り出す関数を定義するには以下のようにします。
from_quad i (a0, a1, a2, a3) = case i of 0 -> a0 1 -> a1 2 -> a2 3 -> a3
foo :: Int -> Int foo x = 1 + x引数が2つ以上ある場合は、矢印をつなげて表します。
hoge :: Int -> Int -> Int hoge x y = x + y2つ以上の引数をとる関数に部分的に引数を与えると、与えた引数の数だけ引数が減少した関数が派生します。 例えば、
引数を指定しないで関数を定義することが可能です。これを利用すると高階関数が
簡潔に書けます。
例:
hoge = (+ 2)
baz = (* 3) . (+ 2) -- baz x = (x+2) * 3
Haskell では文字列は、Char のリスト [Char] として定義されています。
関数名 | 説明 |
---|---|
(:) | list の先頭に要素を1つ追加します。3:[2,1,0] → [3,2,1,0] |
head | list の最初の要素を取り出します。(Lisp の car) |
last | list の最後の要素を取り出します。 |
tail | 最初の要素を取り除いた list を返します。(cdr) |
(!!) | list の n 番目の要素を返します。(list !! n) |
elem | obj が list の要素ならば True を返します。(elem obj list) |
take | list の最初の n 個からなるリストを返します。(take n list) |
drop | list の最初の n 個を除いたリストを返します。(drop n list) |
dropWhite | list の先頭から初めて、predicate が成り立っている間その要素を除外します。
(dropWhile predicate list) 例: dropWhile (==0) [0,1,0,0,1,1] → [1,0,0,1,1] |
(++) | リストを連結します。[3,2] ++ [1,0] → [3,2,1,0] |
length | リストの長さを Integral で返します。length [1,2,3] → 3 |
reverse | リスト を逆順に並べ替えたものを返します。 |
nub | 重複を取り除きます。(module List) |
sum | 数値からなるリストの要素の和を返します。 |
product | 数値からなるリストの要素の積を返します。 |
maximum | リストの要素の最大値を返します。 |
minimum | リストの要素の最小値を返します。 |
-- syntax map fun ls -- example map (+2) [1,2,3,4] → [3,4,5,6] map (\x -> x + 2) [1,2,3,4] → [3,4,5,6]
-- syntax filter predicate ls -- example filter (>0) [-2,-1,0,1,2,3,4] → [1,2,3,4] filter (\x -> x > 0) [-2,-1,0,1,2,3,4] → [1,2,3,4]
-- syntax foldl fun val ls foldr fun val ls -- example foldl (-) 10 [1,2,3,4] → 0 -- ((((10 - 1) - 2) - 3 - 4) foldr (-) 10 [1,2,3,4] → 8 -- (1 - (2 - (3 - (4 - 10))))ちなみに、リストの最初の要素を初期値とする関数 foldl1, foldr1 があります。
map (*2) (filter even [1,2,3,4]) → [4, 8] ⇔ [x*2 | x <- [1,2,3,4], even x] → [4, 8]
関数名 | 動作 |
---|---|
lines | 文字列を1行ずつ分割します。 |
words | 文字列を1単語ずつ分割します。 |
unlines | 文字列のリストを改行文字を挟んでつなげます。 |
unwords | 文字列のリストをスペースを挟んでつなげます。 |
関数部分と IO 部分を分離するために、IO の結果として得られる値は 関数部分で使う値と明確に区別する必要があります。そのような区別をするために IO の結果として得られる値には IO というタグをつけます。 通常の変数では、関数の定義によって値が決まるのに対して IO 型の変数は IO が行われるまで値が特定できません。 従って、両者を区別せずに、IO の結果として得られた値を直接関数部分に渡すと、 関数部分の透明参照性が損なわれます。
詳しくは、
を見てください。maybe_sqrt :: Double -> Maybe Double maybe_sqrt x | x < 0 = Nothing | otherwise = Just $ sqrt x
Main> maybe_sqrt 2 Just 1.4142135623731 Main> maybe_sqrt (-4) Nothing
---- sqrt that return Int if possible
int_sqrt :: Int -> (Either Int Double)
int_sqrt x | fsdx * fsdx == x = Left fsdx
| otherwise = Right sdx
where sdx = sqrt $ fromIntegral x
fsdx = floor sdx
Main> int_sqrt 35 Right 5.91607978309962 Main> int_sqrt 36 Left 6
class Eq a where (==), (/=) :: a -> a -> Bool -- Minimal complete definition: -- (==) or (/=) x /= y = not (x == y) x == y = not (x /= y)また、データ型を(表示させるために)文字列に変換する方法は class Show に書かれています。
詳しくは
自前の data と class を見てください。
7. より詳しく知るには
型については
に詳しく書かれています。
![]() |
![]() |
![]() |
![]() |
![]() |