模式匹配Haskell高阶函数?

xco*_*der 3 haskell

想象一下,我有一个自定义类型和两个功能:

type MyType = Int -> Bool

f1 :: MyType -> Int
f3 :: MyType -> MyType -> MyType
Run Code Online (Sandbox Code Playgroud)

我尝试模式匹配如下:

f1 (f3 a b i) = 1
Run Code Online (Sandbox Code Playgroud)

但它失败了,错误:Parse error in pattern: f1.做上述事情的正确方法是什么?基本上,我想知道有多少f3(作为a和b可能是f3或其他一些功能).

Ben*_*Ben 7

您无法在函数上进行模式匹配.对于(几乎)任何给定的函数,有无数种方法来定义相同的函数.事实证明,在数学上,计算机始终无法确定给定的定义是否表达与另一个定义相同的功能.这也意味着Haskell无法可靠地判断函数是否与模式匹配; 所以语言根本不允许.

图案必须是任一单个变量应用到一些其它的图案的构造函数.记住构造函数以大写字母开头,变量以小写字母开头,你的模式f3 a n i无效; 的图案的"头部" f3是可变的,但它也适用于a,n,和i.这是你得到的错误信息.

由于函数没有构造函数,因此可以匹配函数的唯一模式是单个变量; 匹配所有函数(无论如何都要传递给模式的正确类型).这就是Haskell如何强制执行"无功能模式匹配"规则.基本上,在更高阶函数中,除了将它应用于某个东西并查看它的作用之外,没有办法告诉我们你给出的函数.

该函数f1有类型MyType -> Int.这相当于(Int -> Bool) -> Int.因此,需要一个单一类型的函数参数Int -> Bool.我希望方程f1看起来像:

f1 f = ...
Run Code Online (Sandbox Code Playgroud)

你不需要Int -> Bool通过模式匹配来"检查"它是否是一个函数; 类型保证它会.

你不知道它是一个; 但这通常是将函数作为参数的重点(这样调用者可以选择他们喜欢的任何函数,因为知道你将以相同的方式使用它们).

我不确定你的意思是"我想知道有多少f3在那里".f1总是收到一个单一的功能,而f3不是正确类型的功能传递给f1所有(这是一个MyType -> MyType -> MyType,而不是一个MyType).