我来自一个面向对象的背景(C,c++,java),所以我习惯于用英语阅读一行代码来理解它在做什么。
我目前正在做一项测试,以获得额外的学分。我有几行haskell,我不知道如何阅读,所以我不知道它们是做什么用的。我希望有人能把它们变成英语句子。
举一个我所说的英语句子的例子:
i = i + 1I等于i+ 1的内容。
或
sul ys = all (`elem` ys)函数sul检查ys的所有元素,同时检查是否在ys中找到了特定的元素,然后返回true或false(至少我认为它是这样做的,老师说要忽略all和elem都需要两个参数的事实。
我不能理解的几段代码是:
twasf p = foldr clip [] where
clip x xs | p x = x : xs
| otherwise = [](我不知道如何翻译"|")
infixl 5 <*>
xs <*> ys = zipWith ($) xs ys(我不知道该怎么说)
rd [] = []
rd (a:as) = if a `elem` rd as then as else a : rd as(我想这是“创建一个空列表rd,然后在as中检查a。如果找到,则返回as,否则将a推到前面并返回as)。”
任何帮助都将不胜感激。非常愿意阅读其他网站,如果有人可以指出我在一个网站,帮助你翻译的语言。
发布于 2010-12-09 09:14:33
第一部分:
clip x xs | p x = x : xs
| otherwise = []clip:如果p(x)成立,则返回x:xs,否则返回,否则返回空列表。
xs <*> ys = zipWith ($) xs ys
<*>将函数列表应用于值列表。
rd [] = []
rd (a:as) = if a `elem` rd as then as else a : rd as逐字:
如果列表为空,则返回空列表。否则,检查列表的第一个元素是否被多次包含,如果是,则删除它并返回列表的其余部分。否则返回第一个元素,并将函数递归应用于其余元素。
发布于 2010-12-09 09:13:36
Haskell纯粹是函数式的,所以你不能说“创建,然后检查,做某事”。实体词更适用。
对于最后一个示例,我猜rd是用于删除重复项的,所以我认为是重复项删除…
a:as list:如果a在as中,则是余数as,否则是a,否则是递归删除重复项。顺便说一句。最后一行不应该是…吗?if a elem as then rd as else…?
发布于 2010-12-09 09:12:55
让我们来看看这些,一次一个。
p of x为true,则返回连接到xs上的x,否则返回空列表“。<*>是一个优先级为5的左联中缀操作符”(您必须想出自己对<*>的发音-在这种情况下,我通常会将其视为"op")。下一行是"xs op与用ys压缩的xs相同,使用函数应用程序运算符$".您可能会从阅读一两篇Haskell教程中受益,这将帮助您熟悉Haskell的语法和思考方式-例如,查看http://learnyouahaskell.com/。
https://stackoverflow.com/questions/4393908
复制相似问题