parseした結果をつかわなければ評価されないということの確認。
Parserへの入力文字列が先頭から順番にparseされていくという依存関係によって各Parserが呼び出されていくが、結果を返すreturn xxxはその値が必要とされるまでは遅延評価があるため本当に必要になるまで実行されない。
% cat -n foo.lhs
1 > import Parsing
2 > import Debug.Trace
3
4 > myread :: Read a => String -> a
5 > myread xs | trace("{myread " ++ xs ++ "}") False = read xs
6 > myread xs = read xs
7
8 > myint :: Parser Int
9 > myint = do xs <- many1 digit
10 > return (myread xs)
11
12 > myadd :: Parser Int
13 > myadd = do a <- myint
14 > space
15 > b <- myint
16 > return (a + b)
17
18 > my1st :: Parser Int
19 > my1st = do a <- myint
20 > space
21 > myint
22 > return a
% ghci foo.lhs
GHCi, version 7.0.3: http://www.haskell.org/ghc/ :? for help
Loading package ghc-prim ... linking ... done.
Loading package integer-gmp ... linking ... done.
Loading package base ... linking ... done.
Loading package ffi-1.0 ... linking ... done.
[1 of 2] Compiling Parsing ( Parsing.lhs, interpreted )
[2 of 2] Compiling Main ( foo.lhs, interpreted )
Ok, modules loaded: Parsing, Main.
*Main> parse myadd "1 2"
Loading package array-0.3.0.2 ... linking ... done.
Loading package filepath-1.2.0.0 ... linking ... done.
Loading package old-locale-1.0.0.2 ... linking ... done.
Loading package old-time-1.0.0.6 ... linking ... done.
Loading package unix-2.4.2.0 ... linking ... done.
Loading package directory-1.1.0.0 ... linking ... done.
Loading package process-1.0.1.5 ... linking ... done.
Loading package time-1.2.0.3 ... linking ... done.
Loading package random-1.0.0.3 ... linking ... done.
Loading package haskell98-1.1.0.1 ... linking ... done.
[({myread 1}
{myread 2}
3,"")]
*Main> parse my1st "1 2"
[({myread 1}
1,"")]
*Main> :quit
Leaving GHCi.
%














