这个问题取自考试。我不知道该怎么做。:-(
问题:举一个 haskell 或 ml 函数的例子,它的类型是
( a -> b ) -> ( c -> a ) -> c -> b
怎么做?
这个问题取自考试。我不知道该怎么做。:-(
问题:举一个 haskell 或 ml 函数的例子,它的类型是
( a -> b ) -> ( c -> a ) -> c -> b
怎么做?
什么有意义的功能可以有类型mystery :: ( a -> b ) -> ( c -> a ) -> c -> b
?
看看能有什么
mystery f g x
是?
它需要处理三件事,
x
类型的值c
,g
一种类型的函数c -> a
和f
type 的一种功能a -> b
。它应该产生一个类型的值b
。
唯一与函数有关的参数b
是函数f
,因此结果必须是f ???
。
这里的论点是f
什么?它必须具有 type ,并且从给定参数(忽略底部,,, )a
产生该类型值的唯一方法是应用于某些东西,所以它必须是undefined
error "foo"
g
mystery f g x = f (g ??)
但是可以g
应用于什么?那必须是 type 的值c
。除了底部之外,唯一c
可以从参数构造的类型值是x
,所以
mystery f g x = f (g x)
必须是函数组合(或未定义)。
到目前为止,其他答案实际上并未显示一般执行此操作的逻辑过程。我也不会 100% 详细地展示它,但我会举一个例子。
对此的“深层”技巧是找到给定类型的函数等同于证明逻辑定理。使用Lemmon 系统 L的一种形式(在一些初级逻辑课程中使用的一种更友好的自然演绎形式),您的示例将如下所示:
Theorem: ??? :: (a -> b) -> (c -> a) -> c -> b
1. f :: a -> b (aux. assumption)
2. g :: c -> a (aux. assumption)
3. x :: c (aux. assumption)
4. g x :: a (2, 3, -> elim; assumes 2, 3)
5. f (g x) :: b (1, 4, -> elim; assumes 1, 2, 3)
6. \x -> f (g x) :: c -> b (3, 4, -> intro; discharges 3, assumes 1, 2)
7. \g x -> f (g x) :: (c -> a) -> c -> b
(2, 6, -> intro; discharges 2, assumes 1)
8. \f g x -> f (g x) :: (a -> b) -> (c -> a) -> c -> b
(1, 7, -> intro; discharges 1)
这里的想法是函数式编程语言和逻辑之间存在紧密的对应关系,例如:
因此,“辅助假设”逻辑证明规则(步骤 1-3)对应于引入一个新的自由变量。隐含消除规则(步骤 4-5,又名“作案方式”)对应于函数应用。蕴涵引入规则(步骤 6-8,又名“假设推理”)对应于 lambda 抽象。解除辅助假设的概念对应于绑定自由变量。没有前提的证明的概念对应于没有自由变量的表达式的概念。
该函数是函数组合运算符,通过在 Hoogle 中键入函数的类型,您可以找到:http ://www.haskell.org/hoogle/?hoogle=%28+a+-%3E+b+%29+- %3E+%28+c+-%3E+a+%29+-%3E+c+-%3E+b++
然后您可以单击以显示源:
(.) :: (b -> c) -> (a -> b) -> a -> c
(.) f g = \x -> f (g x)