学习用英语阅读haskell

时间:2010-12-09 00:58:03

标签: haskell

我来自面向对象的背景(C,c ++,java),所以我习惯于用英语阅读一行代码来理解它在做什么。

我目前正在为测试做准备以获得额外的信用。我有几行haskell我无法弄清楚如何阅读所以我无法弄清楚他们做了什么。我希望有人可以把它们变成英语句子。

我所说的英语句子的一个例子是:

i = i + 1

我等于i + 1的内容。

sul ys = all (`elem` ys)

函数sul检查ys的所有元素是否有条件,同时检查ys中是否找到特定元素,然后返回true或false(至少我认为这是什么,老师说忽略了所有和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,然后检查一个in as。如果找到它然后返回as,否则将a推到前面并返回as)

任何帮助都将不胜感激。非常愿意阅读其他网站,如果有人可以指向我帮助您翻译语言的网站。

4 个答案:

答案 0 :(得分:13)

第一部分:

    clip x xs | p x = x : xs 
              | otherwise = []
  

剪辑:如果 p(x)成立,则返回x:xs,否则返回空列表。

xs <*> ys = zipWith ($) xs ys
  

<*>将函数列表应用于值列表。

rd []     = []
rd (a:as) = if a `elem` rd as then as else a : rd as

每个单词:

  

如果列表为空,则返回空列表。否则,检查列表的第一个元素是否包含多次,如果是,则删除它并返回列表的其余部分。否则返回第一个元素并将函数递归到其余元素。

答案 1 :(得分:9)

Haskell纯粹是功能性的,所以你不能真正说“创建,然后检查并做这样的事情”。实质性更好。

对于最后一个示例,我猜rd用于删除重复项,因此我会说重复删除...

    空列表的
  • :是空列表;

  • {li}

    a:as列表:如果as位于a,则as为余数a,否则为if a elem as then rd as else,否则为递归重复删除

顺便说一句。最后一行不应该...... {{1}} ......?

答案 2 :(得分:6)

让我们一次看一下这些。

  1. 管道语法表示 guard ,您可以将其视为与if-else梯形图类似。我会将其读作“如果p x为真,则将x连接到xs,否则返回空列表”。

  2. 第一行说“<*>是左关联中缀运算符,优先级为5”(您必须为<*>提供自己的发音 - 通常在此类我只是把它想象成“op”)。下一行是“xs op ys与用ys压缩的xs相同,使用函数应用程序运算符$”。

  3. 这是具有多个定义的函数的示例。它的工作方式是,如果参数的第一个“模式”匹配,则使用该定义,如果不匹配,则归结为任何其他定义。在这种情况下,我会把它读作“空列表的rd是空列表,否则(等等)”

  4. 您可能会从阅读Haskell教程中受益,这将有助于您熟悉Haskell的语法和思考方式 - 例如,查看http://learnyouahaskell.com/

答案 3 :(得分:3)

如果你将来要做更多的Haskell,那本书Programming in Haskell是一个非常简洁和精彩的介绍,它也告诉你如何正确阅读Haskell。这是本书的一个例子:

abs n |n >= 0     = n 
      | otherwise = −n
  

符号|被读为“这样”,   否则后卫的定义是   简单的标准前奏   否则=真。