アットウィキロゴ
大久保弘崇
掲示板 掲示板 ページ検索 ページ検索 メニュー メニュー

大久保弘崇

ex10.3

最終更新:

hirotakaohkubo

- view
管理者のみ編集可

10.9

newtype Except a b c = E (a b (Either String c))
instance ArrowChoice a => Arrow (Except a)
 
ミッション:
ArrowChoiceなアローaと型b,cがあるとき、
bから(Either String c)というアローをEで包むようなExcept aをArrowにする。
以降、アローaを\leadsto、アローExcept aを\leadsto_eと表す。またEither x y を x+y で表す。
つまりb\leadsto_ecとb\leadstoString+cは同じ意味である。

pure

pure :: (b→c) → (b\leadsto_ec)
pure f は、fをaのコンテキストでpureでアローにして、結果をRightコンストラクタで包めばよい。
pure f = E (pure f >>> pure Right)
 

>>>

(>>>) :: (b\leadsto_ec) → (c\leadsto_ed) → (b\leadsto_ed)
E f >>> E g は、まずfを計算し、その結果がRightならgを計算する。
f :: b \leadsto String+c, g :: c \leadsto String+d, right g :: x+c \leadsto x+(String+d)
繋ぐとxはStringにunifyされる。最終結果を String+d に型合わせするための関数を追加してみる。
E f >>> E g = E (f >>> right g >>> pure destring) where
    destring (Left s) = Left s
    destring (Right (Left s)) = Left s
    destring (Right (Right v)) = Right v
 
型は合うし意味的にも正しいはずなのだが、destringという独自の関数では、次の問題の則を用いた証明が進められない。
mirrorやassocsumを用いて等価な計算を作ることができるのか、よくわからない。

first

first :: (b\leadsto_ec) → ( (b,d)\leadsto_e(c,d) )
first (E f)は、Leftに対してfを計算し、Rightに対してはなにもしない。しかし型は直観的ではない。
f :: b\leadsto_ec すなわち f :: b\leadstoString+c のとき
first (E f) の型は (b,d)\leadstoString+(c,d) であり、(b,d)\leadsto(String+c,d) ではない所が。
使える道具はaのfirstで、first f :: (b,d) \leadsto (String+c,d) こちらは直観的。
first (E f) = E (first f >>> pure deright) where
    deright (Left s,d) = Left s
    deright (Right c,d) = Right (c,d)
 
証明のために、型合わせのための独自関数derightを汎用部品で構成する。
distr :: (Either a b,c) → Either (a,c) (b,c) を使えば、
first (E f) = E (first f >>> pure distr >>> left (pure fst) )
 
とできる。

10.10

上の定義と則から目標を証明できない限り、上の定義が正しいとはいえない。

コメント

名前:
コメント:
記事メニュー
最近更新されたスレッド
人気記事ランキング
ウィキ募集バナー