2016-05-30 9 views
2

Haskellで書かれた大規模なプロジェクトの一環として、私は自分のコード全体で使用する一般的なパラダイムをカプセル化するための小さなユーティリティライブラリに取り組んでいます。私がしたかった、いずれの場合においてもHaskell:safe 'show'

fromLeft :: Either a b -> a 
fromLeft x = case x of 
       (Left x) -> x 
       (Right y) -> error "fromLeft: (Right _)" 

fromRight :: Either a b -> b 
fromRight x = case x of 
       (Right x) -> x 
       (Left y) -> error "fromRight: (Left _)" 

:私が働いていた一つの関数(むしろ又は二つの機能は、)antichiralコンストラクタに未定義である部分の機能は、(errorは正確には)でありfromLeft :: Either a b -> afromRight :: Either a b -> b、ありますできるだけこれらの機能を拡張して、各機能の2番目のパターン一致のyshowのタイプのものであれば、"_"の代わりに印刷されるようにしてください。しかし、シグネチャに制約を置かずにこれらの関数が一般性を失わせるようなことはないという明確な方法はありません。

これらのタイプキャスティングのインスタンスに対してタイプメッシュ機能を選択的に実行し、他のタイプの一般的な結果を返すことができる拡張またはモジュールブードーはありますか?具体的には、無効な機能に \x -> if (showable x) then show x else "_"

+3

[タイプはHaskellでショーのインスタンスであるかどうかを確認してください?](http://stackoverflow.com/questions/35785176/check-whether-a-type-の可能性のある重複is-an-show-in-haskell) –

+5

https://wiki.haskell.org/GHC/AdvancedOverlapには、その問題と解決策があります。私はそれらを実装することをお勧めしません! – ibotty

+0

@ibottyそれは面白そうです。シェアのためにありがとう。しかし、私はあなたの警告に耳を傾けないかもしれません:P – archaephyrryx

答えて

4

をシミュレートするプログラムを書くためのHaskellではどのような方法がありますどのようにこの程度:

、あなたのコードでは、あなたは aでのインスタンスであることがわかっている場合は、
fromRightWith :: (a -> String) -> Either a b -> b 
fromRightWith show (Left a) = error $ "fromRight: (Left " ++ show a ++ ")" 
fromRightWith _ (Right b) = b 

fromRight :: Either a b -> b 
fromRight = fromRightWith $ const "_" 

fromRight' :: Show a => Either a b -> b 
fromRight' = fromRightWith show 

ShowfromRight'を使用してください。ない場合は、fromRightを使用します。

instance Show MyError where 
    show = -- .. 

trySomething :: IO (Either MyError Value) 
trySomething = --- .. 

main = do 
    value <- fromRight' <$> trySomething 
    -- .. 
+0

この答えをありがとう。これは多かれ少なかれ私が考えていたものですが、@ibottyは私が最終的に使用した興味深いリソースを提供していました(少なくとも時間がたつにつれ、 – archaephyrryx