Function Composition - Haskell
再次,我在项目Euler问题上的尝试产生的另一个问题(从上一个问题继续)。我无法理解以下内容:
明确地
号
来自ghci的map的第一个参数的类型签名是->c:
来自ghci的map (product . take 13)的类型签名是[[b]]->[b]:
。
我是不是说,作为map的第一个参数应该是一个函数,[[b]]不是指一个列表,而是指由(product . take 13)生成的(部分应用的)函数列表,其中部分函数的第二个参数来自(tails number)?
- 不,product . take 13已经是一个函数了(这里从一些c的列表中(其中c是Num的一个实例),因为我们想把c乘以c你应该从右向左读:首先你把所有最后的段的数字列表(见tails)都取出来,然后再乘以数字(但只有首先13)在这里,对于这些部分(map (product . take 13)中的每个部分),然后取这些产品的最大值(每个部分记住一个),最后打印出来。
- 当某些代码难以理解时,请简化!Prelude Data.List> map (take 4) (tails [1..5])==>[[1,2,3,4],[2,3,4,5],[3,4,5],[4,5],[5],[]]。这是错误的(这里只考虑长度为4的2个子序列);查看我最近对您以前问题的回答。
以下是无点版本:
ZZU1
让我们更清楚一点:
ZZU1
如你所见,它首先得到数字列表的最后部分(这又是一个列表)
然后,它使用EDOCX1为每个细分市场获取产品(同样是一个列表)
最后,它搜索这些产品的EDOCX1并返回它
附言:我在两个版本中都去掉了EDOCX1-2,我认为EDOCX1-3只会使事情复杂化,这并不重要……我认为EDOCX1您可以在以后打印出来;)
- 我们可以把它进一步分开,如map (f . g) == map f . map g。
- 是的,这是真的,但我认为take 13部分只是一个预防长时间运行或某些事情的措施(必须承认,我没有谷歌搜索问题本身),我认为我们也可以刺激它来简化理解。
- 但好吧-我们现在就开始吧
- 是的,我知道-好主意-已经做了;)-谢谢
- 现在很明显,"只占13个数字"对这个工作来说是错误的:这个问题涉及的是长度为13的子序列,而不是长度为13的子序列。当然,这不是你的错误。:)
- 我知道我的判断有点快…sadyl my edit和您的评论同时出现;)
- 你一点也没有错,操作程序引用的代码是错误的。:)
- 我得读一下我猜的问题:D
- hm take 13原则上是错误的,但对于项目示例来说是有效的,因为短尾不会给出最大值,特别是最后一个数字是零。但是,例如,它将中断1111111 09999999999。
- 是的-但问题更多的是类型,而不是欧拉问题,所以我选择让它,因为它是…但是谢谢
- @是的,没错。
- @任性哦哈,我还没看到你的答案,所以我独立地想出了一个基本相同的例子。
BLCK1
是的,EDOCX1的第一个参数应该是一个函数。看它的类型:
ZZU1
它需要一个类型为EDOCX1到5的函数。但在您的案例中,EDOCX1指的是EDOCX1:
ZZU1
所以,这是一个函数,它获取元素EDOCX1到8的列表,并从中生成一个类型为EDOCX1到9的值。您可以在ghci中进行实际测试:
ZZU1-4型
为了简单起见,它的应用方式如下:
ZZU1墨水
EDOCX1-10是一个普通函数,类型为:
ZZU1
所以,这个函数接受一个元素列表,并给出一个元素列表。你可以在ghci玩这个游戏:
ZZU1
我希望能说清楚。