以下のような機能が欲しいのですが、可能でしょうか?実際、型 Pattern が存在するかどうかはわかりません。
fun1 a :: Pattern a -> a -> Bool
fun1 pattern a = case a of
pattern -> True
_ -> False
以下のような機能が欲しいのですが、可能でしょうか?実際、型 Pattern が存在するかどうかはわかりません。
fun1 a :: Pattern a -> a -> Bool
fun1 pattern a = case a of
pattern -> True
_ -> False
これは Haskell では不可能だと思います。
ただし、あなたの場合、パターンは事実上 type の関数ですa -> Bool
。したがって、パターンを受け入れる代わりに、 から までの任意の関数を受け入れa
ますBool
。あなたの例は、に関数を適用するのと同じa -> Bool
ですa
。
ここで、 の本体でパターンから一致したシンボルを使用できるようにするなど、より一般的なことをしfun1
たい場合、関数ではそれを実行できません。しかし、これが Haskell で可能であるとは思えません。意味を成すには、型システムへの奇妙な拡張が必要になるでしょう。Haskell でのパターン マッチングは一級市民ではないため、そのようにパターンを渡すことはできません。
この種の動作が必要な場合は、著者がHaskellよりも一般的なパターンマッチング機能を備えた言語を開発および形式化するPattern Calculusという本をチェックしてください。Haskell とは異なり、パターンを第一級市民にします。私はまだこの本を実際に読み終えていませんが、そのようなコードはまさにあなたが書くことができるものであると確信しています。
著者は、 bondiと呼ばれるパターン マッチングに関する彼の考えに基づいて言語を構築しました。特に本を気にしたくない場合は、チェックアウトする価値もあります。実用化できるかどうかはわかりませんが、面白いのは確かです。
機能的な真珠、タイプセーフパターンコンビネータをチェックしてください。少しグーグルすると、それに基づくハッキングパッケージもあることがわかります。
View Patternsを探していると確信しています。
( trac/ghc/wikiまたはghc/user-manual/syntax-extensions を参照)
すべての関数は「パターン」です。
case "string that ends with x" of
(last->'x') -> True
_ -> False
case "foo" of
(elemIndex 'g'->Just i) -> i+5
(elemIndex 'f'->Nothing) -> 23
_ -> 42
do
x <- fmap foo bar
=
do
(foo->x) <- bar