我可以将模式传递给函数吗?

时间:2012-07-05 00:42:56

标签: haskell

我想要一个像下面这样的功能,这可能吗? 事实上,我不知道模式是否存在。

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

3 个答案:

答案 0 :(得分:13)

我不认为在Haskell中这是可能的。

但是,在您的情况下,模式实际上只是a -> Bool类型的函数。因此,不接受模式,而是接受aBool的任何功能。您的示例等同于在a -> Bool上应用函数a

现在,如果你想做一些更通用的事情,比如能够使用fun1主体中模式的匹配符号,你就无法用函数来做。但是,我怀疑这对Haskell来说是可能的 - 它需要类型系统的奇怪扩展才有意义。 Haskell中的模式匹配根本不是一流的公民,所以你无法真正传递模式。

如果您想要这种行为,请查看作者开发的书籍Pattern Calculus,并使用比Haskell更具通用模式匹配功能的语言形式化。与Haskell不同,它使模式成为一流的公民。我还没有完成这本书,但我很确定像这样的代码正是你能写的东西,等等。

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

答案 1 :(得分:12)

查看功能珍珠,Type Safe Pattern Combinators。一点谷歌搜索显示,基于它的Hackage package也是如此。

答案 2 :(得分:0)

我很确定您正在寻找查看模式

(请参阅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