私は最近、述語関数を別の関数に渡す必要がある状況に遭遇しており、私が探しているロジックは、基本的に「この値がこのパターンに一致するか」というものです。
宣言、do
ブロック、リスト内包表記ではパターンマッチングが推奨されるようですが、述語を使用する関数がいくつかありa -> Bool
、パターンを何らかの方法で渡すと非常に便利です。たとえば、takeWhile
、until
、find
、span
、など
これまでのところ、私は\a -> case a of MyCons _ -> True; otherwise -> False
名前付き関数のアラを書いてきましたlet myPred (MyCons _) = True; myPred _ = False in
が、どちらもひどく醜く、あまり慣用的ではないようです。「明白な」(そして間違った)方法は、次のようなものです\(MyCons _) -> True
が、当然、部分的であるためにエラーをスローします。
この種のことを行うためのより簡潔でクリーンな方法はありますか?または私は物事を完全に間違った方法で行っていますか?
let myPred...
スタイルが悪いと思うことは必ずしも必要ではありませんが、非常に単純なアイデアに期待するよりもはるかに冗長に感じられます。
maybe :: b -> (a -> b) -> Maybe a -> b
とbool :: a -> a -> Bool -> a
、引数(複数可)としての機能(複数可)ブール生産とそれを使用しています。たとえばmyCons z f (MyCons x) = f x ; myCons z f _ = z
、次に呼び出しますmyCons False (const True) aMyConsValue
。これはあなたが書いたものとほぼ同じで、関数の引数を介してベイクされた「間接」/「抽象化」のもう1つのレベルがあります。
let
嫌いな節でかなり満足します-同等のwhere
節を好むので、これは主な定義を混乱させません。もちろん、このユーティリティが2回以上必要になる場合は、トップレベルの関数として定義します。