Help us understand the problem. What is going on with this article?

Haskellの型システムについての1人語り

まえがき

周りにHaskellerがいなくて、話す友達もいないので誰かに語りたくなりました。

なにも実のない自己満足の記事です。

対象者

  • Haskell入門した人
  • Haskellちょっとだけわかる人
  • Haskellちょっとだけ学んだけどなにがいいんだ???ってなってる人

本編

今回話したいのはずばり、関数持ち上げです。これだけです。

Haskellを学んだ人ならお馴染みだと思いますが、関数持ち上げについて少し説明すると、通常の引数を取る関数を、モナドやファンクターを取る関数に変えることです。

例を上げると、

add :: Num a => a -> a -> a
add = (+)

という関数をJust 123Just 456に適用したい場合、

addMaybe :: Num a => Maybe a -> Maybe a -> Maybe a
addMaybe (Just m) (Just n) = Just (add m n)
addMaybe _        _        = Nothing

とすることも可能ですが、これではMaybeにしか適用できないので、ファンクター値全てに適用させるためには、

addApplicative :: (Number a, Applicative f) => f a -> f a -> f a
addApplicative = liftA2 add

とすることができます。

すると、add関数とaddApplicative関数の型を比べてみると、

add :: Num a => a -> a -> a
addApplicative :: (Number a, Applicative f) => f a -> f a -> f a

と、変わっていることがわかります。

これが関数持ち上げです。

ここからが本題で、このliftA2関数の型がすごく好き。という話になります。

まずliftA2の型を調べてみると、

liftA2 :: Applicative f => (a -> b -> c) -> f a -> f b -> f c

はい、もう大好きです。

これを読み解くと、2引数関数とアプリカティブファンクター値を2つ受け取り、それらのアプリカティブファンクター値に関数を適用しアプリカティブファンクターに入れて返すという関数だと言うことがわかります。

しかし、これ、こうとも取れないですか?

liftA2 :: Applicative f => (a -> b -> c) -> (f a -> f b -> f c)

こうすろと、2引数関数を受け取って、アプリカティブファンクター用の2引数関数を返す関数に見えてきませんか?

見えますよね?????

もう一つ見てみましょう。

Control.ApplicativeからExportされている演算子の、<*>様です。いつもお世話になってます。

この関数の型は、

(<*>) :: Applicative f => f (a -> b) -> f a -> f b

こうなってます。同じくこれも読んでみると、1引数関数の入ったアプリカティブファンクター値とアプリカティブファンクターを受け取り、その中身に関数を適用する関数となりますが、先程同様天使の括弧をつけると、

(<*>) :: Applicative f => f (a -> b) -> (f a -> f b)

こう読めます。これは、1引数関数の入ったアプリカティブファンクターを受け取り、アプリカティブファンクター用の関数を返す関数になります。

もうやべぇですよね

つまり、Haskellの関数部分適用という素晴らしい機能とえげつない神がかった型システム機能によって、こんなにも素晴らしい型表示ができるのです。

あとがき

みんなもHaskellやろうや!!!Haskeller友達欲しいです!はい!

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away