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

Jas*_*son 12 haskell

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

fun1 a :: Pattern a -> a -> Bool
fun1 pattern a = case a of
    pattern -> True
    _ -> False
Run Code Online (Sandbox Code Playgroud)

Tik*_*vis 13

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

但是,在您的情况下,模式实际上只是类型的函数a -> Bool.因此,与其接受的模式,从接受任何功能aBool.你的例子相当于在一个函数a -> Bool上应用一个函数a.

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

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

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


Dan*_*ner 12

查看功能珍珠,类型安全模式组合器.一些谷歌搜索显示,还有一个基于它的Hackage包.