今日の晩飯カツ丼

プログラミングに関する記事を書いてます。

[マニプロ]初めてのHaskell編(初投稿)

マニアックプログラミング略してマニプロの初投稿です🎉 (ネーミングセンスが、、)
マニプロでは不定期で、数日かけて有名では無いプログラミング言語の基礎の基礎を習得して皆さんに使いやすさなどを書いていこうと思ってます。
注:ちょっと触ったくらいなので、誤った情報が混ざっている可能性があります

A.そもそも何故そんな捻くれたことをしようと思ったんですか? → 興味本位。自分は、ストレートのみで168kmの投手よりも、超多彩な変化球を持つ148kmの投手の方がロマンを感じる人だからです。

といっても初投稿ってこともあってHatena Blogを書く練習も兼ねてそんなにマニアックではありません。今回はHaskell編です!

HaskellってAtcoderで使ってる人がたまにいるようなイメージがある。
存在自体は知ってたけど、どんなものなのかがあまり分かってなかったので、気になって基礎の基礎を習得しました。

そもそもHaskellとは

知らない人もいるでしょう。
ja.wikipedia.org

こういう時のwikipedia

Haskellの特徴

関数型言語

最大の特徴(?)ですかね。関数の組み合わせでプログラムを書きます。

遅延評価

特徴的ですね。
遅延評価というのは、評価するべき値を必要となる時まで評価しない仕組みのことを言います。
例えば、、
Java

int a = b;
int b = 1;
System.out.print(a);

Haskell

a = b
b = 10
print x

Javaだともちろんエラーが出ますが、Haskellだとあら不思議、ちゃんと1と表示されます。

モナド

モナドは、純関数型言語の欠点を埋める為に存在しています。IO処理をする為に必要らしいです。        そこまでやってないから詳しいことは分からん

強力な型システム

Haskellは強力な静的型付けです。Int,Double,Floatなどがあります。
また、それと同時に強力な型推論も行います。逐一型を宣言しなくて良いのは楽で助かります。

Haskellを使ってみた

まずはHello World!
main = do putStrLn "Hello World!"

main = do 処理 これがエントリーポイントです。

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系だと思います)

面白いか   ★★★★☆☆☆☆☆☆(淡々とした言語なので自分の性には合わなかったかも)

またやるか  ★★★★★☆☆☆☆☆(他とは違って純関数型なので、ちょくちょく触るかも)