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

学习用英语阅读haskell 我来自一个面向对象的背景(C,C++,java),所以我习惯于读一段英语代码来理解它在做什么。,haskell,Haskell,为了获得额外的学分,我目前正在做一项测试。我有几行哈斯克尔的诗,我不知道怎么读,所以我不知道它们是做什么的。我希望有人能把它们写成英语句子 我所说的英语句子的一个例子是: i = i + 1 i等于i+1的内容 或 函数sul检查ys的所有元素是否存在条件,同时检查在ys中是否找到特定元素,然后返回true或false(至少我认为它是这样做的,老师说忽略了all和elem都需要两个参数的事实) 我无法理解的代码有: twasf p = foldr clip [] where clip

为了获得额外的学分,我目前正在做一项测试。我有几行哈斯克尔的诗,我不知道怎么读,所以我不知道它们是做什么的。我希望有人能把它们写成英语句子

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

i = i + 1

i等于i+1的内容

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

我无法理解的代码有:

twasf p = foldr clip [] where
    clip x xs | p x = x : xs 
              | otherwise = []
(我不知道如何翻译“|”)

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


任何帮助都将不胜感激。如果有人能给我指出一个帮助你翻译语言的网站,我非常愿意阅读其他网站。

让我们一次看一看这些网站

  • 管道语法表示一个防护,您可以认为它类似于if-else梯形图。我将其理解为“如果
    x
    p
    为true,则返回连接到
    xs
    x
    ,否则返回空列表”

  • 第一行说“
    是一个具有优先权5的左联想中缀运算符”(你必须为
    想出你自己的发音-通常在这种情况下,我会把它看作是“op”)。下一行是“xs-op-ys与xs-zip-by-ys相同,使用函数应用程序运算符
    $

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


  • 阅读一两篇Haskell教程可能会让你受益匪浅,这将有助于你熟悉关于Haskell的语法和思考方式——例如,签出。

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

    对于最后一个例子,我想
    rd
    是用于删除重复项的,所以我想说删除重复项

    • 空列表的名称:为空列表

    • a:as
      列表:如果
      a
      as
      中,则为剩余的
      as
      ,否则为
      a
      后递归删除重复项

    顺便说一句,如果元素和其他元素一样,那么最后一行不应该是…

    第一部分:

        clip x xs | p x = x : xs 
                  | otherwise = []
    
    clip:Ifp(x)保持,返回x:xs,否则返回空列表

    字数:

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


    如果你将来要做更多的Haskell,这本书是一个非常简洁和漂亮的介绍,它还告诉你如何正确地阅读Haskell。下面是这本书的一个例子:

    abs n |n >= 0     = n 
          | otherwise = −n
    
    符号|被解读为“这样”, 另外,防护装置的定义见 标准序曲 否则=真


    …这就是为什么我很难将注意力集中在函数式程序上,因为它们读起来就像是充满被动语态的数学方程式。带有角色的连续故事(即OO程序)比我更有效。其他人有这样的印象吗?非常感谢!这让我开始:)我更喜欢Damien的实体词作为函数代码的读物。@luqui:你知道,如果答案是错误的或者根本没有用,你应该投反对票。你发现另一个答案更有用,这通常不是投票否决的理由。但这是你的名声。@luqui这是我从大多数人身上看到的行为。如果你看一下绝对票数,你会发现,大多数答案根本没有否决票,只有非常奇怪、错误或离题的答案几乎总是否决票。如果您不是舒尔,请随时向meta询问下一票何时好,何时不好。@luqui下一票箭头的工具提示是“此答案无效”。你真的觉得它没用吗?还是仅仅因为你喜欢一种不同的方法?(我顺便注意到,社区已经确定同意/不同意作为元投票的含义)I等于I+1的内容。这里没有平等,这是误导。我会说,
    将I的内容设置为I的内容,再加上一个
    你知道,你可以通过点击下方的绿色箭头来接受答案。这通常会让其他人更乐意回答您的问题。我通常将“
    ”发音为“ap”,因为它与Control.Monad中的
    ap
    函数的用途相同。
    rd []     = []
    rd (a:as) = if a `elem` rd as then as else a : rd as
    
        clip x xs | p x = x : xs 
                  | otherwise = []
    
    xs <*> ys = zipWith ($) xs ys
    
    rd []     = []
    rd (a:as) = if a `elem` rd as then as else a : rd as
    
    abs n |n >= 0     = n 
          | otherwise = −n