Haskell趣学ガイドライン入門ノート(二)

6396 ワード

型宣言を表示します.Haskellは型を定義しない理由で、pythonに似ています.
式のタイプを特定するには
1 *Main> :t 'a'
2 'a' :: Char
3 *Main> :t True
4 True :: Bool
5 *Main> :t "HELLo"
6 "HELLo" :: [Char]
使用可能:t表示
したがって、関数を定義するときに、タイプ宣言を付けることができます.
body.hs関数
addthree::Int -> Int ->Int -> Int
addthree x y z =x+y+z
fac::Integer -> Integer
fac n= product [1..n]
*Main> fac 100
93326215443944152681699238856266700490715968264381621468592963895217599993229915608941463976156518286253697920827223758251185210916864000000000000000000000000
 
Integerは高精度で、メモリが多く、どれだけの数を表すことができます.
 
タイプクラス
Eqクラス
*Main> 'a'=='a'
True
*Main> 5/=6
True
*Main> 
 
Ordクラス比較サイズクラス.他にもいくつかのクラスがあります
関数構文---パターンマッチング
c++Switch caseのように
sayMe::Int-> String
sayMe 1="One!"
sayMe 2="Two!"
sayMe 3="Three!"
sayMe 4="Four!"
sayMe 5="Five!"
sayMe x="Not between 1 and 5!"

よびだし
*Main> :l body
[1 of 1] Compiling Main             ( body.hs, interpreted )
Ok, modules loaded: Main.
*Main> sayMe 5
"Five!"
 
自分でhead関数を書く
1 head' :: [a]->a
2 head' []=error "Can call head on an empty list,dummy!"
3 head' (x:_)=x
Asモードで何が起こっているのか分からず、多分自分で自分を呼び出したのか???
1 firstletter :: String->String
2 firstletter ""="Empty string,whoops!"
3 firstletter all@(x:xs)="The first letter of" ++ all ++ " is " ++[x]
4 
5 
6 *Main> firstletter "Dracula"
7 "The first letter ofDracula is D"
8 *Main> 
警備員、またcase文のようです
 1 bkm:: Double->String
 2 bkm bmi
 3   | bmi<=18.5="1!"
 4   | bmi<=25.0="2!"
 5   | bmi<=30.0="3!"
 6   | otherwise=">3"
 7 
 8 
 9 *Main> bkm 19.9
10 "2!"
whereキーワードは1つの値を繰り返し計算しないでください
 1 bkm:: Double->Double->String
 2 bkm weight height
 3   | bmi<=skinny="1!"
 4   | bmi<=normal="2!"
 5   | bmi<=fat="3!"
 6   | otherwise=">3!"
 7   where bmi=weight/height^2
 8         skinny=18.5
 9         normal=25.0
10         fat=30.0
モジュール内のコード注意pythonに似ています
 
let文:バインド文は前、後に式
1 *Main> (let a=100;b=200;c=300 in a*b*c,let foo="Hey";bar="there!" in foo++bar)
2 (6000000,"Heythere!")
 
なんとCase表現もありました.
 
面白い再帰ですね.
もとはここの急速な順序付けはこのように書くことができて、とても簡潔です
 
 1 quicksort [] =[]
 2 quicksort (x:xs)=
 3    let small=[a|a<-xs,a<=x]
 4        lager=[a|a<-xs,a>x]
 5    in quicksort small++ [x]
 6 
 7 Prelude> :l body
 8 [1 of 1] Compiling Main             ( body.hs, interpreted )
 9 Ok, modules loaded: Main.
10 *Main> quicksort [1,2,3,4,5,6,9,7,8]
11 [1,2,3,4,5,6,7,8,9]
この早列はこの原始的なものでしょうが、それ自体は少し問題があるかもしれません.毎回リストの最初の要素を選んでいますが、確かに簡潔ですね.
 
このブログは主に自分がHaskellに入門した点滴を計上している.
うまく書けないので,どうかお許しください.