[マニプロ]初めてのHaskell編(初投稿)
マニアックプログラミング略してマニプロの初投稿です🎉 (ネーミングセンスが、、)
マニプロでは不定期で、数日かけて有名では無いプログラミング言語の基礎の基礎を習得して皆さんに使いやすさなどを書いていこうと思ってます。
注:ちょっと触ったくらいなので、誤った情報が混ざっている可能性があります
A.そもそも何故そんな捻くれたことをしようと思ったんですか? → 興味本位。自分は、ストレートのみで168kmの投手よりも、超多彩な変化球を持つ148kmの投手の方がロマンを感じる人だからです。
といっても初投稿ってこともあってHatena Blogを書く練習も兼ねてそんなにマニアックではありません。今回はHaskell編です!
HaskellってAtcoderで使ってる人がたまにいるようなイメージがある。
存在自体は知ってたけど、どんなものなのかがあまり分かってなかったので、気になって基礎の基礎を習得しました。
Haskellの特徴
関数型言語
最大の特徴(?)ですかね。関数の組み合わせでプログラムを書きます。
遅延評価
特徴的ですね。
遅延評価というのは、評価するべき値を必要となる時まで評価しない仕組みのことを言います。
例えば、、
Java
int a = b; int b = 1; System.out.print(a);
a = b b = 10 print x
Haskellを使ってみた
1~5まで足す
func :: Int -> Int func x | x==1 = 1 | otherwise = x + func (x-1) main = do print (func 5)
普通はfor文を使って変数に足していくと思いますが、Haskellは変数の再代入が許されておらず、for文も存在しないので再帰で実装しています。
" | "はifみたいなもので、x==1の時1を返す、otherwise(その他)の時はx + func (x-1)を返すという仕組みです。
カリー化
func :: Int -> Int -> Int func x y = x + y func2 :: Int -> Int func2 a = func 2 a main = do print (func2 5)
と
(省略) func2 :: Int -> Int func2 = func 2 (省略)
は同じで、下はカリー化されています。func2の引数aとfunc 2 aで共通していると、両辺から共通部分を省略することが出来ます。
関数合成
(省略 f,gを関数として定義) func x = f (g x) func x = (f.g) x
上下の式は同じ値を出力します。
すると、カリー化と関数合成を合わせることで〜
func = f.g
も上の式と同じ値を出力します!
これを応用すれば、、
(省略) func x y = f (g x y) func2 x y = f(g' y) g xをg'に置き換える func2 x y = f.g' y func2 x = f.g' func2 x = f.(g x) func2 x = f' (g x) f.をf'に置き換える func2 = f'.g func2 = (f.).g
となり、func x y = f (g x y) と func2 = (f.).gは同じ値を出力します。
パズルやってるみたいで面白かったです。
Haskellを使ってみて
Haskellの基礎の基礎をやってみました!
自分は有名どころの言語(Java,C#,Javascript,PHP...)しか使ったことがなかったので、Haskellが人生で初の関数型言語でした。
慣れてないからちょっと分かり難かった(笑)
でも、関数型なので命令型では普段味わうことが出来ない新鮮な書き方を学ぶことが出来て面白い!
という事で今回はこれで終了! 最後に評価を書いておきます。
記事を読んで頂きありがとうございましたm(_ _)m
評価
注:自分が感じた評価ですので、酷評しても怒らないでください
習得のしやすさ★★★★★★☆☆☆☆(日本語の文献が多く存在しているので習得はし易い。ただ、多くの人は命令型に慣れちゃっていると思うので6)
理解のしやすさ★★★★★☆☆☆☆☆(命令型に慣れているので、少し難しかった)
読みやすさ ★★★★★★★★★☆(関数型ってこともあって、何をしたいかが関数の雰囲気で分かる)
書きやすさ ★★★★★★★★☆☆("()"や"{}"などを書かなくて良いので、スピーディーに記述することが出来ます)
実用性 ★★★☆☆☆☆☆☆☆(金融系で使われていることもあるらしいですが、ほとんどがJava,C系だと思います)
面白いか ★★★★☆☆☆☆☆☆(淡々とした言語なので自分の性には合わなかったかも)
またやるか ★★★★★☆☆☆☆☆(他とは違って純関数型なので、ちょくちょく触るかも)