IFPHのサポートページに公開されている、12章のプログラムをHaskell Platform (ghc 7.6.3 , OS: Windows)でそのままでは動かなかったので、修正したところを公開します。
動かし方
テキスト中の例は、Example.lhs
に記述されているので、それをロードして実行するのが手っ取り早いと思います。自分で、独自の計算をしたいときも、Example.lhs
に習って書けば良いと思います。
ghci> :l Examples
ghci> ex6
修正箇所
MonadZeroが記述されていますが、すでに廃止されているようで、うまく動きません。MonadZeroのzero
とplus
を合わせたのが、Control.Monad
で定義されているMonadPlus
に当てはめれそうなので、そのように変更します。
> {- plusをmplusに変更
> module MyParseLib
> (Parser, plus, orelse, item, many, some, manywith, somewith,
> sat, char, string, digit, lower, upper, letter, alphanum,
> ident, space, token, symbol, applyParser) where
> -}
> module MyParseLib
> (Parser, mplus, orelse, item, many, some, manywith, somewith,
> sat, char, string, digit, lower, upper, letter, alphanum,
> ident, space, token, symbol, applyParser) where
> import Control.Monad
> {-
> instance MonadZero Parser where
> zero = MkP f
> where f s = []
> -}
> {-
> plus :: Parser a -> Parser a -> Parser a
> p `plus` q = MkP f
> where f s = papply p s ++ papply q s
> -}
> instance MonadPlus Parser where
> mzero = MkP (\inp -> [])
> p `mplus` q = MkP f
> where f s = papply p s ++ papply q s
>
後は、Functorのメソッドがmap
になっているのをfmap
に、isAlphanum
をisAlphaNum
にします。それから、isAlphaNum
はData.Char
に定義されているので、それもインポートすれば、MyParseLib.lhs
のコンパイルは通るようになります。
> import Data.Char
> instance Functor Parser where
> -- map f p = MkP g
> fmap f p = MkP g
> where g s = [(f x, s') | (x,s') <- papply p s]
> alphanum :: Parser Char
> -- alphanum = sat isAlphaum
> alphanum = sat isAlphaNum
後、コンパイルが通らなかったところはUtilities.lhs
のpartitions
です。以下のように変更すると、コンパイルが通るようになります。
> partitions :: Int -> [a] -> [[[a]]]
> partitions 0 [] = [[]]
> partitions n [] = []
> partitions 0 _ = []
> partitions n (x:xs) = [[x]:yss | yss <- partitions (n-1) xs] ++
> [(x:ys):yss | ys:yss <- partitions n xs]
修正したファイルはここに置いておきます。