12

Data.Map および Data.IntMap のルックアップ関数は現在、型シグネチャを使用して Maybe でラップされた値を返します。

lookup  :: Ord  k => k -> Map  k a -> Maybe  a

以前は、より一般的なタイプの

lookup  :: (Monad  m, Ord  k) => k -> Map  k a -> m a

前者は余分な型指定の必要性を減らす可能性が高いと思いますが、後者はより一般的になり、リスト内包表記でルックアップを使用できるようになります。新しいバージョンでこの動作を模倣する方法はありますか、または古いバージョンのライブラリを使用する必要がありますか?

4

3 に答える 3

21

後者はそれをより一般化し、ルックアップをリスト内包表記で使用できるようにします

モナドクラスの大多数が fail as を定義しているため、後者もより安全ではありませんerror。つまり、Map で要素が見つからないという一般的なケースは、ほとんどのモナドのプログラム終了エラーです。これは、間違った型コンテキストが推論される可能性が高まることと相まって、現在、「モナドの失敗を返す」スタイルを思いとどまらせる傾向があることを意味します。

新しいバージョンでこの動作を模倣する方法はありますか

確かにあります!次のように、Maybe a を Monad a にリフトするだけです。

lift :: Monad m => Maybe a -> m a
lift Nothing  = fail "you die now"
lift (Just a) = return a

そして今、あなたは書くことができます、例えばlift . lookup

于 2010-06-13T01:52:10.057 に答える
6

Don は の要素を一般的な対応する要素にlift変換するため、おそらく か何か という名前にする必要があります;-)MaybeMonadconvertgeneralize

lookupを主にリスト内包表記や を実装する他のモナドで使用したい場合failは、パターン マッチの失敗を にマッピングすることもできますfail

プレリュード> [ v | ただ v <- return $ lookup "hi" [("ho","silver")] ]
[]
プレリュード> [ v | ただ v <- return $ lookup "ho" [("ho","silver")] ]
["銀"]

Prelude> do Just v <- return $ lookup "hi" [("ho","silver")] ; v を印刷
*** 例外: ユーザー エラー (<interactive>:1:3-8 での do 式のパターン一致失敗)
Prelude> do Just v <- return $ lookup "ho" [("ho","silver")] ; v を印刷
"銀"
于 2010-06-13T08:42:07.143 に答える
5

リストモナドの特定のケースでは、最も簡単な解決策は次を使用することmaybeToListです。

Prelude> :m +Data.Maybe -- Note: Use "import Data.Maybe" in a program file

Data.Maybe> [ v | v <- maybeToList $ lookup "hi" [("ho","silver")] ]
[]
Data.Maybe> [ v | v <- maybeToList $ lookup "ho" [("ho","silver")] ]
["silver"]
于 2010-06-13T10:37:21.463 に答える