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。因此,不要接受模式,而是接受来自ato的任何函数Bool。您的示例等效于a -> Boola.

现在,如果您想做一些更通用的事情,例如能够使用 的主体中的模式中的匹配符号fun1,您将无法使用函数来做到这一点。然而,我怀疑这对 Haskell 来说是不可能的——它需要对类型系统进行奇怪的扩展才能有意义。Haskell 中的模式匹配根本不是一等公民,所以你不能真正像那样传递模式。

如果您想要这种行为,请查看Pattern Calculus一书,作者在其中开发和形式化了一种具有比 Haskell 更通用的模式匹配特性的语言。与 Haskell 不同,它使模式成为一等公民。我还没有真正完成这本书,但我很确定这样的代码正是你能够编写的,除此之外。

作者围绕他关于模式匹配的想法构建了一种语言,称为bondi;它可能也值得一试,特别是如果您不想打扰这本书。我不知道它是否准备好实际使用,但它肯定很有趣。

于 2012-07-05T01:20:34.340 回答
12

查看 Functional Pearl,Type Safe Pattern Combinators。一些谷歌搜索表明还有一个基于它的Hackage 包。

于 2012-07-05T04:37:42.460 回答
0

我很确定您正在寻找View Patterns

(参见trac/ghc/wikighc/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 回答