R.バード、P.ワドラー共著、武市正人、武市しげ子 共訳の 「関数プログラミング」 (原題 Functional Programming)が、 Miranda を扱っている。以降、同書を FP と略する。 FP では一種の説明用言語を用いているが、 これは Miranda と類似している。 実はまだ理解するところまで読んでいない。 最初のあたりを読んで思ったことは,楽な言語があるんだ、ということだった。 この本が出た頃は,そう簡単に言語処理系が手に入らなかったし, たとえ入ったとしてもなかなか実用上動かしにくかったろうな。 今は、Haskell で勉強できる。いい時代になったものだ (2008-04-20)。
事実、上記の本を Haskell で記述した本が Bird 単著で出版されており、 その後山下伸夫による邦訳が関数プログラミング入門 ―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 | / | div | mod | × | ⧺ | ∧ | ∨ | ¬ | ≠ | ≧ | ≦ |
---|---|---|---|---|---|---|---|---|---|---|---|
Miranda | / | div | mod | * | ++ | & | \/ | ~ | ~= | >= | <= |
Haskell | / | div | mod | * | ++ | && | || | ~ | \= | >= | <= |
FP の ⧺ は +と+がつながっているフォントである。そのような記号は、 Double Plus として Unicode の ⧺ または ⧺ として定義されている。 (2020-11-25)
利用者が定義する中置演算子は、Mirandaではすべて文字 $ を先頭につける。 Haskell では、バッククォーテション ` で前後を囲む。
Mirandaでは、*, **, *** で表す。 Haskell では、a, b, c などで表す。
なお、FP 邦訳 の p.296 では、map の定義が誤って
map :: (* -> **) -> [**] -> [**]
となっている。正しくは次の通り。
map :: (* -> **) -> [*] -> [**]
Haskell の関数 foldl は FP 本文中の定義と同じであり、 Miranda とは異なる。
項目 | Miranda | Haskell |
---|---|---|
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