我正在阅读新书 Haskell Programming from First Principles 。看起来不错,但我觉得解释中有一些令人困惑的漏洞。如果我遗漏了一些基本的东西,我道歉。
第5章的最后一个问题是填写???事情是有道理的:
munge :: (x -> y) -> (y -> (w, z)) -> x -> w
munge = ???
向我解释的解决方案(经过多次讨论之后):
g :: y -> (w, z)
g = undefined
f :: x -> y
f = undefined
munge :: (x -> y) -> (y -> (w, z)) -> x -> w
munge g f v = fst (g (f v))
我以两种方式对这个例子感兴趣。
首先,似乎munge
函数应该将函数作为输入,需要x -> y
。但是munge
的定义方式,似乎我们首先向函数v
提供了一个额外的参数f
。但是如果f :: x -> y
,那么f v
这个词只不是y
而不是x -> y
类型的那个?
其次,我很难理解为什么x
出现在类型声明中倒数第二的位置。那时我觉得(y -> (w,x))
步骤之后的逻辑下一篇文章应该只是w
,因为在那个阶段,函数g
正在应用于fst
和{{ 1}}应该是w
返回的类型。我可以感觉到我很接近,但不能完全缩小差距。
显然我不能正确理解符号。谁能让我直截了当?
编辑:好的,这是第二部分的澄清问题。是否可以修改fst
函数,使其具有以下类型(即省略了倒数第二个munge
应用程序的原始类型)?如果是这样的话会是什么样的?
x