ぺんぎんさんのおうち

日記です。たまに日記じゃないこともあります。

Haskellする略してハッ -1-

最近Haskellを始めたので、Pythonと比較しながら記事を書きます
※備忘録だと思ってください

まず初歩から、

変数の宣言

--Haskell
val = 10
  
#Python
val = 10

見た目的には同じですが、ここで大きく異なるのは、再代入ができないことです。 Pythonではa = 100; a = 12;
のように、変数に値を代入した直後また別の値を再代入することができますが、Haskellでは 一度変数に値を代入すると束縛(バインド)されるため、再代入できません。
※正確には、Pythonで言う代入Haskellでは束縛と呼ぶので代入という表現は間違いです(多分)。

関数の宣言

--Haskell
--Signature 関数名 引数 = 戻り値
funcSamp x = x*2 

#Python
#Signature def 関数名(引数):
def func(arg*):
    return hoge

Haskell関数型言語なので、Pythonと違って必ず戻り値を持ちます。
例えば、 x > 10 が真のとき1を返すとします。

returnOne x = if x >10 then 1

ですが、これだとx <= 10の時の挙動が確定していませんね。
関数型言語である以上、関数でプログラムを構成していくので、必ず何かを返さなければなりません。

--訂正
returnOne x = if x > 10
                 then 1 
                 else 0

のように、esleで指定します。
Pythonで戻り値を指定しない場合はNoneTypeが返ります。

リストについて

--Haskell
lis1 = [1,2,3,4]
lis2 = ["Has", kell"]
#Python
lis1 = [1,2,3,4]
lis2 = ["Py", "thon"]

文字列や数値のリストを作る方法は同じです。
Pythonはかなり柔軟なリストを作成できますが、Haskellは基本的に同じ型のみで構成されるリストしか作れません。
連続した数値や文字列でリストを作りたいときは

--Haskell
[1..n]

で1~nまでの要素で作られます。 ステップも指定でき

[2,5..20] --> [2,5,8,11,14,17,20]

のような書き方で記述します。等差数列みたいですね。 一方Pythonでは

[i for i in range(10)]      #[0,1,2,3,4,5,6,7,8,9]
[i for i in range(1,10)]    #[1,2,3,4,5,6,7,8,9]
[i for i in range(2,20,3)]  #[2,5,8,11,14,17,20]

こんな感じ。
Haskell
[n..m]で[n, n+1, n+2, ... , m]のリストが作れらますが、
Pythonだと
[i for i in range(n,m)]で[n,n+1, n+2 ... , m-1] のリストが作られます。
※Python3での話です。2.xはrange(n)でリストが作られます。(内包表記は後々触れます)

今回はここまで