関数型言語 Miranda

作成日 : 2008-04-14
最終更新日 :

関数型言語 Miranda

R.バード、P.ワドラー共著、武市正人、武市しげ子 共訳の 「関数プログラミング」 (原題 Functional Programming)が、 Miranda を扱っている。以降、同書を FP と略する。 FP では一種の説明用言語を用いているが、 これは Miranda と類似している。 実はまだ理解するところまで読んでいない。 最初のあたりを読んで思ったことは,楽な言語があるんだ、ということだった。 この本が出た頃は,そう簡単に言語処理系が手に入らなかったし, たとえ入ったとしてもなかなか実用上動かしにくかったろうな。 今は、Haskell で勉強できる。いい時代になったものだ (2008-04-20)。

事実、上記の本を Haskell で記述した本が Bird 単著で出版されており、 その後山下伸夫による邦訳が関数プログラミング入門 ―Haskellで学ぶ原理と技法―として出版されている。

Haskellとの違い

Haskell との違いを検証するのは、Gofer と同様である。 以下の記述は、FP 付録 C 「Miranda によるプログラミング」 の補足である。

条件付等式

Miranda で、ガードの前の if を省略するが、 Haskell では | を使う。 従って、FP p.295 の strep は、Haskell では次のようになる。

strep xs  
    | ys == []    = [0]
    | otherwise   = ys
                    where ys = dropWhile(== 0) xs

Miranda の dropwhile が Haskell の dropWhile に相当する。

基本演算子

FP/divmod × ¬
Miranda/ div mod * ++ & \/ ~ ~= >= <=
Haskell / div mod * ++ && || ~ \= >= <=

FP の ⧺ は +と+がつながっているフォントである。そのような記号は、 Double Plus として Unicode の &#10746; または &#x29FA; として定義されている。 (2020-11-25)

利用者定義の演算子

利用者が定義する中置演算子は、Mirandaではすべて文字 $ を先頭につける。 Haskell では、バッククォーテション ` で前後を囲む。

型変数

Mirandaでは、*, **, *** で表す。 Haskell では、a, b, c などで表す。

なお、FP 邦訳 の p.296 では、map の定義が誤って
map :: (* -> **) -> [**] -> [**]
となっている。正しくは次の通り。
map :: (* -> **) -> [*] -> [**]

標準関数

Haskell の関数 foldl は FP 本文中の定義と同じであり、 Miranda とは異なる。

項目MirandaHaskell
foldl foldl :: (* -> ** -> **) -> ** -> [*] -> **
foldl f a [] = a
foldl f a (x:xs) = foldl f (f x a) xs.
foldl :: (a -> b -> a) -> a -> [b] -> a
foldl f a [] = a
foldl f a (x:xs) = foldl f (f a x) xs.
関数 zip zip2 zip
Miranda になく、 Haskell にある関数 - foldl1 foldr1 scan fst snd max min (max と min は中置演算子もあり )

まりんきょ学問所関数型言語手習い > 関数型言語 Miranda


MARUYAMA Satosi