LotosLabo

プログラミング技術とか気になった情報を載せていきます

Haskellについて

f:id:lo25131:20140327145509j:plain


Haskellハスケル)とは、純粋な関数型言語です。

C言語とかJavaとかといった、言語とはちょこっと異なります。


開発環境


こちらよりHaskellをダウンロードできます。

http://www.haskell.org/platform/

インストーラに沿って手順を進めていけば出来ます。

インストールが終わりましたら、インストールされた「WinGHCi」を起動します。



始め方

WinGHCiを起動します。


f:id:lo25131:20140327150436j:plain


Prelude> この部分に書いていきます。

基本処理

文字表示

Prelude> "Hello world"
"Hello world"


演算

Prelude> 1 + 2 * 3
7

/ % + - *

div 整数の除算
mod 整数除算の剰余


データ型

Int 固定長整数
Integer 多倍長整数
Float
Double


文字と文字列

char
'a'

String
"aiu"

つなげる
Prelude> "aiu" ++ "eo"
aiueo


比較演算子


== /= <> <= >=

true or falseで返す


論理演算子

 not 否定
 &&  論理積 And
 ||  論理和 OR


条件分岐

if then else

1行で表す

(例)
if 1 < 2 then 1 + 2 else 1 - 2

※elseは省略できない


これでもできる

if (1 < 2) {
 1 + 2
}else{
 1 - 2
}


変数

名前 = 式

let 名前 = 式

Prelude> let x = 10
Prelude> x
10

let a = 20 + 20
でも可能

let a = "hello"


タプル

複数のデータ型を組み合わせて新しいデータ型を定義すること


Prelude>let a = (1,2)
Prelude>a
(1,2)

Prelude> :t a
a :: (Integer, Integer)

:t はデータ型を調べるghciのコマンド
(1,2)がInteger,Integerなのでこれが出力される。

10,0.535 だと Integer,Doubleになる


パターンマッチング

タプルから要素を取り出す

Prelude>let (a,b) = (1,2)
Prelude>a
1

Prelude> let (a, b) = ((1, 2), 3)
Prelude> a
(1,2)


fst 第一要素を取り出す

fst (1,2)
1

snd 第二要素を取り出す

snd (1,2)
2


リスト

配列のようなもの

Prelude> let a = [1,2,3,4]
Prelude> a
[1,2,3,4]


Prelude> :t a
a :: [Integer]


リストは関数head,tailを使って分解する
演算子 「:」 (コンス演算子)で合成する

またリストを直結するには ++ を使う

head

Prelude> a
[1,2,3,4]

Prelude> head a
1

先頭を返す aが先頭になる

tail

Prelude> tail a
[2,3,4]

先頭要素を除いたもの

演算子 「:」

Prelude> let e = 0 : a
Prelude> e
[0,1,2,3,4]

先頭に0を付け加える

つなげる 「++」

Prelude> let f = [1,2,3] ++ [4,5,6]
Prelude> f
[1,2,3,4,5,6]

空リスト

Prelude>let x = tail[1]
Prelude>x
[]


関数


名前 引数 = 式
let 名前 引数 = 式

Prelude>let bai x = x * 2
Prelude>bai 10
20

10 = x という意味になる

また、データ型も設定できます。

let bai x = x * 2 ::Integer


絶対値

ngateを使って絶対値を求める

Prelude> ngate 4

  • 4

Prelude> ngate (2 - 5)
3


応用計算

Prelude> (+) 1 2
3

Prelude> (-) ((*) 3 4) 7
5


コメント

 -- コメントになる



ファイルの読み込み


まず元となるファイルを作成します。

main.hs
ーーーーーー
day :: Int
day = 40

WinGHCiのFileタブよりLoadしてファイルを指定します。


また、:cd C:\ディレクトリパス

を指定し、:load "ファイル名"

でもロードできます。


f:id:lo25131:20140327163924j:plain



コマンド・ラインからのファイルの読み込み

まず元となるファイルを作成します

hello.hs
ーーーーー
main :: IO()
main = putStrLn "Hello,world"

コマンド・ライン(コマンドプロンプト)にてファイルにあるディレクトリに移動する

ghc --make hello.hs

で出力する

そうするとそこのディレクトリに.exeファイルが作成される。

.exeファイルが作成されたのを確認して、helloと入力するとHello,worldと表示されます。


f:id:lo25131:20140327164625j:plain


プログラムの合成

 >> コマンドを合成できます

(例)

main :: IO ()
main = putStrLn "1st line" >> putStrLn "2nd line"

ちなみにこれはこのように書き換えられます

main :: IO ()
main = do
putStrLn "1st line"
putStrLn "2nd line"

doの式は必ず字下げをしなければならない



無限リスト

ちょっと小ネタ

WinGHCiで

Prelude> [1,3..]

と入力すると、奇数を無限に表示させます。
止めるには上の一時停止ボタンかCtrl+Cを押すと止まります。

こんなかんじに


f:id:lo25131:20140327165635j:plain


これもファイルから読み込んでも表示できます。


main.hs
ーーーーーー
ones :: [Integer]
ones = 1:ones


これをLoadすると


こうなります

f:id:lo25131:20140327165853j:plain