2009年10月25日日曜日

Haskell その1

erlangはネイティブのバイナリファイルが生成できなかったので、
今度はそれができるHaskellを試してみた。

C++系統の言語とは異なりすぎているので、
なかなか慣れるまでに時間がかかる。
とりあえず、絶対値を求める関数を作った。

module Main where
import Text.Printf

main = do printf "abs -10 is %d\n" (10::Int)
printf "abs -10 is %d\n" ((abst (-10)) ::Int)
printf "abs -20 is %d\n" (absi (-20))

abst x = if x < 0 then -x else x

absi :: Int -> Int
absi x = if x < 0 then -x else x

順に説明する。調べ始めたばかりなので、
間違いが混じっているかもしれない。

 module Main where
はプログラムのエントリポイントを指定している。
C++で言うところのmain関数の名前を指定している。
 import Text.Printf
printfを使うために必要
 main = do
これ以降にメイン関数の定義を書く。
printfは書式付の関数。10::IntはInt型の数字として10を使用することを明示している。明示しないとコンパイルエラーになる。
先に、abstとabsiについて説明する。
abst x = if x < 0 then -x else x
これは、引数xを取る関数abstの定義であって、もしxが0より小さければ-xを、そうでなければxを返すことを表している。
absi :: Int -> Int
これはabsiの関数の宣言でInt型の引数を取り、戻り値の型もIntであることを宣言している。
absi x = if x < 0 then -x else x
はabsiの定義であり、内容はabstと同じ。
printfの説明に戻る。
printf "abs -10 is %d\n" ((abst (-10)) ::Int)
abstに-10を引数として渡して、得られる値を出力するということである。
-10を()で囲っているが、囲まないと-と10が分かれてしまってエラーとなる。
さらに::Intで戻り値の型を指定している。
abstは関数の定義だけを行って、型がどうなっているかの宣言を記載していないので、ここで明示しないと型が曖昧だと言われ、エラーとなる。
printf "abs -20 is %d\n" (absi (-20))
こちらは::Intが不要である。関数の宣言で戻り値がIntであることを明示しているためである。

その他、コードを書くときのルールであるが、インデントによってブロックの範囲が決められる。
タブの使用には注意が必要である。
うっかりスペース4個のタブを使うとコンパイルエラーになる。
スペース8個のタブなら問題ない。

0 件のコメント :