我想要一个像下面这样的功能,这可能吗?事实上,我不知道 Pattern 类型是否存在。
fun1 a :: Pattern a -> a -> Bool
fun1 pattern a = case a of
pattern -> True
_ -> False
我想要一个像下面这样的功能,这可能吗?事实上,我不知道 Pattern 类型是否存在。
fun1 a :: Pattern a -> a -> Bool
fun1 pattern a = case a of
pattern -> True
_ -> False
我认为这在 Haskell 中是不可能的。
但是,在您的情况下,模式实际上只是 type 的函数a -> Bool
。因此,不要接受模式,而是接受来自a
to的任何函数Bool
。您的示例等效于a -> Bool
在a
.
现在,如果您想做一些更通用的事情,例如能够使用 的主体中的模式中的匹配符号fun1
,您将无法使用函数来做到这一点。然而,我怀疑这对 Haskell 来说是不可能的——它需要对类型系统进行奇怪的扩展才能有意义。Haskell 中的模式匹配根本不是一等公民,所以你不能真正像那样传递模式。
如果您想要这种行为,请查看Pattern Calculus一书,作者在其中开发和形式化了一种具有比 Haskell 更通用的模式匹配特性的语言。与 Haskell 不同,它使模式成为一等公民。我还没有真正完成这本书,但我很确定这样的代码正是你能够编写的,除此之外。
作者围绕他关于模式匹配的想法构建了一种语言,称为bondi;它可能也值得一试,特别是如果您不想打扰这本书。我不知道它是否准备好实际使用,但它肯定很有趣。
查看 Functional Pearl,Type Safe Pattern Combinators。一些谷歌搜索表明还有一个基于它的Hackage 包。
我很确定您正在寻找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