12

以下のような機能が欲しいのですが、可能でしょうか?実際、型 Pattern が存在するかどうかはわかりません。

fun1 a :: Pattern a -> a -> Bool
fun1 pattern a = case a of
    pattern -> True
    _ -> False
4

3 に答える 3

13

これは Haskell では不可能だと思います。

ただし、あなたの場合、パターンは事実上 type の関数ですa -> Bool。したがって、パターンを受け入れる代わりに、 から までの任意の関数を受け入れaますBool。あなたの例は、に関数を適用するのと同じa -> Boolですa

ここで、 の本体でパターンから一致したシンボルを使用できるようにするなど、より一般的なことをしfun1たい場合、関数ではそれを実行できません。しかし、これが Haskell で可能であるとは思えません。意味を成すには、型システムへの奇妙な拡張が必要になるでしょう。Haskell でのパターン マッチングは一級市民ではないため、そのようにパターンを渡すことはできません。

この種の動作が必要な場合は、著者がHaskellよりも一般的なパターンマッチング機能を備えた言語を開発および形式化するPattern Calculusという本をチェックしてください。Haskell とは異なり、パターンを第一級市民にします。私はまだこの本を実際に読み終えていませんが、そのようなコードはまさにあなたが書くことができるものであると確信しています。

著者は、 bondiと呼ばれるパターン マッチングに関する彼の考えに基づいて言語を構築しました。特に本を気にしたくない場合は、チェックアウトする価値もあります。実用化できるかどうかはわかりませんが、面白いのは確かです。

于 2012-07-05T01:20:34.340 に答える
12

機能的な真珠、タイプセーフパターンコンビネータをチェックしてください。少しグーグルすると、それに基づくハッキングパッケージもあることがわかります。

于 2012-07-05T04:37:42.460 に答える
0

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
于 2012-07-16T00:10:04.720 に答える