我正在研究这个问题的一个版本:http://blog.gja.in/2014/01/functional-programming-101-with-haskell.html#.WIi0J7YrKHo
然而,如果我输入一个chop chop 1,0,0,它应该返回0,3,0,0。我试着使用上面网站上给出的代码,但我似乎无法弄明白它。我也只是在3-4天前才开始学习Haskell,所以我不确定下一步的正确方向。
提前谢谢你!
发布于 2017-01-26 04:14:34
我想你误解了你的意图。正如rampion所指出的,chop [1,0,0,0]应该导致[0,0,0]。我不明白你是从哪里得到[0,3,0,0]的,但我会给你介绍一下。
首先,介绍chop的定义,并提供一些注释,让我可以参考该定义的每个部分。
chop [] = [] --chopNull
chop (1:xs) = xs --chopHead1
chop (n:xs) = (replicate (n - 1) (n - 1)) ++ xs --chopHeadN你问了chop chop [1,0,0,0]的事。这不是有效代码。我猜你指的是chop (chop [1,0,0,0])。以此为起点,我将执行一些等式推理。也就是说,我将通过替换定义的相关部分来转换有问题的程序片段。每行都有一个注释,指示当前行是如何从上一行计算出来的。
chop (chop [1,0,0,0])
= chop (chop (1:0:0:0:[]) --De-sugaring of List
= chop (chop (1:xs)) --Let xs = 0:0:0:[] = [0,0,0]
= chop (xs) --chopHead1
= chop (0:0:0:[]) --def of xs
= (replicate (0 - 1) (0 - 1)) ++ (0:0:[]) --chopHeadN
= [] ++ (0:0:[]) --From definition of replicate
= (0:0:[]) --From defintion of (++)
= [0,0] --re-sugaring我在上面做了一些松散的事情。值得注意的是,我在评论中将xs等同于(0:0:0:[])。这只是为了明确定义中的模式匹配如何满足特定的替换。接下来,我使用chopHeadN定义来匹配n=0的大小写,因为它是第一个匹配的。在复制和(++)的定义上,你必须相信我。
这就是那个特定的调用应该做的事情。但是,通常情况下,如果您不知道某个特定函数的作用,最好从一些简单的输入开始。对于列表,一个空的列表[]或单例的[n]是很好的起点。然后转到两个元素列表。如本例所示,您可以剪切定义的一部分,并检查该部分对已知数据的作用。在ghci中自己来做。(实际上,这就是我对replicate (0-1) (0-1)表达式所做的。我认为这将是一个错误。)
https://stackoverflow.com/questions/41854009
复制相似问题