大久保弘崇
ex12.3
最終更新:
hirotakaohkubo
-
view
ex12.13
関数 format は d1 :ˆ: d2 に対して左側と右側の指示子が要求する値をカリー化して順にとり、
それらを文字列化して返す関数を作らなければならない。
しかし、format d1 と format d2 から返される関数はいったいいくつの引数を要求するのかわからないので、両者を束ねようがない。
それらを文字列化して返す関数を作らなければならない。
しかし、format d1 と format d2 から返される関数はいったいいくつの引数を要求するのかわからないので、両者を束ねようがない。
ex12.14
(少し自信なし)
よくある蓄積変数を用いる構造にしたため、蓄積変数の初期値を
format2 指示子 データ1…データn ""(初期値)
のように追加の引数として渡さなければならないようになってしまった。
よくある蓄積変数を用いる構造にしたため、蓄積変数の初期値を
format2 指示子 データ1…データn ""(初期値)
のように追加の引数として渡さなければならないようになってしまった。
format2 :: Dir (String->String) y -> y
format2 d = format2' d id id
format2' :: Dir x y -> ((String->String) -> x) -> ((String->String) -> y)
format2' (Lit s) = \ cont out -> cont (\x -> out (s++x))
format2' (Int) = \ cont out -> \ i -> cont (\x -> out (show i++x))
format2' (String) = \ cont out -> \ s -> cont (\x -> out (s++x))
format2' (d1 :^: d2) = format2' d1 . format2' d2
ex12.15
問題12.14と同様の高速化を図ることもできるが、ここでは素朴な解のみを示す。
data Dir x where
End :: Dir String
Endd :: Dir (String->String)
Lit :: String -> Dir y -> Dir y
Int :: Dir y -> Dir (Int ->y)
String :: Dir y -> Dir (String->y)
format :: Dir x -> x
format d = format' d ""
format' :: Dir x -> String -> x
format' End out = out
format' (Lit s next) out = format' next (out ++ s)
format' (Int next) out = \ i -> format' next (out ++ show i)
format' (String next) out = \ s -> format' next (out ++ s)
ex12.16 ×
ex12.17
型のユニフィケーションをアシストするためのラッパWrapを補助的に用いる。
スクラッチでという意味がわからない。
スクラッチでという意味がわからない。
newtype Wrap a = Wrap { unWrap :: a }
from :: forall a b . (a:=:b) -> (a->b)
from p = unWrap . apply p . Wrap
to :: forall a b . (a:=:b) -> (b->a)
to = from . symm