首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Haskell中砍掉九头蛇

在Haskell中砍掉九头蛇
EN

Stack Overflow用户
提问于 2017-01-25 22:23:29
回答 1查看 589关注 0票数 0

我正在研究这个问题的一个版本: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,所以我不确定下一步的正确方向。

提前谢谢你!

EN

回答 1

Stack Overflow用户

发布于 2017-01-26 04:14:34

我想你误解了你的意图。正如rampion所指出的,chop [1,0,0,0]应该导致[0,0,0]。我不明白你是从哪里得到[0,3,0,0]的,但我会给你介绍一下。

首先,介绍chop的定义,并提供一些注释,让我可以参考该定义的每个部分。

代码语言:javascript
复制
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])。以此为起点,我将执行一些等式推理。也就是说,我将通过替换定义的相关部分来转换有问题的程序片段。每行都有一个注释,指示当前行是如何从上一行计算出来的。

代码语言:javascript
复制
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)表达式所做的。我认为这将是一个错误。)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41854009

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档