Haskell勉強会

関数型プログラミングの学習日記

Haskellの矢印の記号「->」の読み方

Haskellの勉強メモ。

 

haskell.hatenablog.com

 

(p.120) 関数の型

Prelude> :t not
not :: Bool -> Bool

->という矢印のような表現が型の部分に出てきました。

関数の型はこのように「何かの型->何かの型」という型で表され、「矢印の元の型の値を受け取って、矢印の先の型の値になる」関数であることを意味します。

 

で、この「->」という矢印の記号をHaskellでは何と呼ぶのか?記号の読み方が説明されていなかったので調べてみました。

 

他のプログラミング言語だと「->」という記号には「アロー演算子」などという名前が付けてあります。

 

qiita.com

 

Haskellでも「->」という記号は「アロー演算子」と呼ぶのでしょうか?

 

Haskell アロー演算子 - Google 検索

このキーワードで検索しても、よく分かりませんでした。

Haskell "->" 読み方 - Google 検索

このキーワードで検索したら、以下のような情報が出てきました。

 

kquoe2.hatenablog.com

-> -> 型コンストラクカインド

 

他にもいろんな記号が紹介されていました。たくさんありますね!

 

記号 読み方(意味、例)
! アレーのインデクス。(!) :: Ix i => Array i e -> i -> e
! 正格(strict)フラグ。foo !x -> foo strict x。とか
!! リストのインデクス。(!!) :: [a] -> Int -> a
$ カッコのかわり ($) :: (a -> b) -> a -> b
$! カッコのかわりの正格バージョン。$!以降が先に評価される
&& 論理積。(&&) :: Bool -> Bool -> Bool
() カッコ。ユニット型。() :: ()
* 掛け算。(*) :: Num a => a -> a -> a
*, #, ?, ??, ~ カインド。型制約
>, <>, <* アプリカティブ。Applicative f => f a -> f b -> f b、f (a -> b) -> f a -> f b、f a -> f b -> f a
++ concat。(++) :: [a] -> [a] -> [a]
, カンマ。タプル型コンストラクタ。(,) :: a -> b -> (a, b)
-> 型コンストラクタ。カインド
. ピリオド。パイプ。関数の合成。(.) :: (b -> c) -> (a -> b) -> a -> c
/ 割り算。(/) :: Fractional a => a -> a -> a
/= 論理否定。(/=) :: Eq a => a -> a -> Bool
: コロン。コンス。リスト型コンストラクタ。(:) :: a -> [a] -> [a]
:: (の)タイプ(は)
:{, :} ghci上で複数行
< 小なり。Ord a => a -> a -> Bool
<$, <$> ファンクタ。(f)map。Functor f => a -> f b -> f a、 (a -> b) -> f a -> f b
<- 束縛、バインド(IOアクション)
<= 小なりイコール。Ord a => a -> a -> Bool
<> mappend。(<>) :: Monoid m => m -> m -> m
== イコール。(==) :: Eq a => a -> a -> Bool
=> 型制約。Ord a => a、とか。
> 大なり。Ord a => a -> a -> Bool
>-> ストリームとしてつなぐ。Pipe
>= 大なりイコール。Ord a => a -> a -> Bool
>>, >>=, =<<, >=> モナド。バインド。Monad m => m a -> m b -> m b、m a -> (a -> m b) -> m b、(a -> m b) -> m a -> m b,(a -> m b) -> (b -> m c) -> a -> m c
@ as。アズパターン。ll@(l:ls)とか。
[ ] 空リスト。[ ] :: [t]
\ ラムダlambda。(\x -> x ^2) 3 -> 9
& 空文字列"" -> 文字列パース用
_ ワイルドカードパターン。
| ガードの区切り。内包表記list comprehensionの区切り
|| 論理和。(||) :: Bool -> Bool -> Bool
~ 反駁不可能パターン。レイジーパターン。irrefutable pattners, lazy patterns
{ } レコード構文、記法(フィールドに名前をつける)ときの大カッコ。
^ 累乗。(^) :: (Integral b, Num a) => a -> b -> a
% 有理数有理数割り算。(%) :: Integral a => a -> a -> Ratio a

 

Haskellの「->」という記号は、「型コンストラクタ」「カインド」という仕組みと関係してるみたいです。

この情報を手掛かりとして、もう1回検索してみます。

Haskell "->" 型コンストラクタ - Google 検索

Haskell "->" カインド - Google 検索

 

haskell.jp

 

haskell.jp

うーん、いまいちよく分かりません。

 

他にも、こんな情報もありました。

en.wikibooks.org

 

stackoverflow.com

 

stackoverrun.com

 

(->) is often called the "function arrow" or "function type constructor", and while it does have some special syntax, there's not that much special about it.

(Googl翻訳)

( - >)はしばしば "function arrow"や "function type constructor"と呼ばれ、特別な構文はありますがそれほど特別なことはありません。

 

  • function arrow → 関数アロー
  • function type constructor → 関数型コンストラクタ―

こんな日本語になるのでしょうか?

 

仕方ないので、しばらくは「->」を「矢印」という名前で呼んでおきます。

Haskellの記号には矢印っぽいのがたくさんあるので、これだと言葉だけでは何を指しているのか?曖昧だけど、仕方ないですね。

 

「->」の情報

前回勉強した「:t」「:k」「:i」コマンドで「->」の情報を調べてみます。

 

f:id:hamamuratakuo:20190119202520p:plain

 

Prelude> :t (->)
<interactive>:1:2: error: parse error on input ‘->’

Prelude> :i (->)
data (->) (a :: TYPE q) (b :: TYPE r)   -- Defined in ‘GHC.Prim’
infixr 0 ->
instance Applicative ((->) a) -- Defined in ‘GHC.Base’
instance Functor ((->) r) -- Defined in ‘GHC.Base’
instance Monad ((->) r) -- Defined in ‘GHC.Base’
instance Monoid b => Monoid (a -> b) -- Defined in ‘GHC.Base’
instance Semigroup b => Semigroup (a -> b) -- Defined in ‘GHC.Base’

Prelude> :k (->)
(->) :: * -> * -> *

こんなのが出ました。(意味不明w)

 

Haskellの「->」という記号の正確な名称、読み方が分かったら、追記しておきたいと思います。

とりあえず、ここでは気になったことのメモとして残しておきます。