学习用英语阅读haskell

Mat*_*oot 12 haskell

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

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

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

i = i + 1
Run Code Online (Sandbox Code Playgroud)

我等于i + 1的内容.

要么

sul ys = all (`elem` ys)
Run Code Online (Sandbox Code Playgroud)

函数sul检查ys的所有元素是否有条件,同时检查ys中是否找到特定元素,然后返回true或false(至少我认为它是什么,老师说要忽略所有elem这两个都需要两个的事实参数.

我无法理解的几段代码是:

twasf p = foldr clip [] where
    clip x xs | p x = x : xs 
              | otherwise = []
Run Code Online (Sandbox Code Playgroud)

(我不知道如何翻译"|")

infixl 5 <*>
xs <*> ys = zipWith ($) xs ys
Run Code Online (Sandbox Code Playgroud)

(我不知道怎么说)

rd []     = []
rd (a:as) = if a `elem` rd as then as else a : rd as
Run Code Online (Sandbox Code Playgroud)

(我认为这是"创建一个空列表rd,然后检查一个in as.如果找到它然后返回as,否则将a推到前面并返回as)

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

fuz*_*fuz 13

第一部分:

    clip x xs | p x = x : xs 
              | otherwise = []
Run Code Online (Sandbox Code Playgroud)

clip:如果p(x)成立,则返回x:xs,否则返回空列表.

xs <*> ys = zipWith ($) xs ys
Run Code Online (Sandbox Code Playgroud)

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

rd []     = []
rd (a:as) = if a `elem` rd as then as else a : rd as
Run Code Online (Sandbox Code Playgroud)

每个单词:

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

  • @luqui:你知道,如果答案是错误的*或根本没用,你应该只是投票.你发现另一个更有用的答案通常不是投票的理由.但这是你的声誉. (5认同)
  • @luqui downvote箭头的工具提示是"这个答案没用".你真的觉得它没用*吗?或者只是你喜欢不同的方法?(我顺便提一下,社区已经同意/不同意作为**的投票意义*) (3认同)
  • @luqui这是我从大多数人那里看到的行为.如果你看看绝对投票计数,你会发现,大多数答案都没有任何支持,只有非常奇怪,错误或偏离主题的答案几乎总是掉头.如果你不舒服,可以随意询问关于什么时候downvote是好的,什么时候不好. (2认同)

Dam*_*let 9

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

对于最后一个例子,我猜rd是删除重复项,所以我要说重复删除...

  • 空列表:是空列表;

  • 一的a:as名单:是余as,如果aas,或a随后递归重复拆卸,否则.

BTW.不应该最后一行if a elem as then rd as else......?


Ano*_*on. 6

让我们一次看一下这些.

  1. 管道语法表示一个保护,您可以将其视为与if-else梯形图相似.我将它读作"如果px是真的,那么返回x串接到xs,否则返回空列表".

  2. 第一行说" <*>是一个左关联的中缀运算符,优先级为5"(你必须提出自己的发音<*>- 通常在这种事情中我只是把它想象为"op").下一行是"xs op ys与使用函数应用程序运算符的ys压缩的xs相同$".

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

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