我想要一个像下面这样的功能,这可能吗? 事实上,我不知道模式是否存在。
fun1 a :: Pattern a -> a -> Bool
fun1 pattern a = case a of
pattern -> True
_ -> False
答案 0 :(得分:13)
我不认为在Haskell中这是可能的。
但是,在您的情况下,模式实际上只是a -> Bool
类型的函数。因此,不接受模式,而是接受a
到Bool
的任何功能。您的示例等同于在a -> Bool
上应用函数a
。
现在,如果你想做一些更通用的事情,比如能够使用fun1
主体中模式的匹配符号,你就无法用函数来做。但是,我怀疑这对Haskell来说是可能的 - 它需要类型系统的奇怪扩展才有意义。 Haskell中的模式匹配根本不是一流的公民,所以你无法真正传递模式。
如果您想要这种行为,请查看作者开发的书籍Pattern Calculus,并使用比Haskell更具通用模式匹配功能的语言形式化。与Haskell不同,它使模式成为一流的公民。我还没有完成这本书,但我很确定像这样的代码正是你能写的东西,等等。
作者围绕他关于模式匹配的想法建立了一种语言bondi;它可能也值得一试,特别是如果你不想打扰这本书的话。我不知道它是否已经准备好用于实际用途,但它确实很有趣。
答案 1 :(得分:12)
查看功能珍珠,Type Safe Pattern Combinators。一点谷歌搜索显示,基于它的Hackage package也是如此。
答案 2 :(得分:0)
我很确定您正在寻找查看模式。
(请参阅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