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.Printfprintfを使うために必要
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 件のコメント :
コメントを投稿