【问题标题】:Confused about workings of a Haskell list comprehension对 Haskell 列表理解的工作感到困惑
【发布时间】:2015-10-22 01:44:38
【问题描述】:

我是一名新程序员,正在使用 Haskell。我找到了一行名为 find 的代码,它将一个字符串与列表中的对应对相匹配。像这样

find a b = [x|(y,x) <- b, a==y]

我不完全理解这个程序在说什么,对于列表理解,因为我以前从未见过x|(y,x)以这种方式使用,我主要看到它用作x|x或@ 987654324@。那么,这是否意味着从输入列表B 中找到字符串A = x 的列表理解,其中x 是来自B 的一对(String, Char),并且对于它y 等于您输入的a?这里有点困惑。

【问题讨论】:

    标签: list haskell


    【解决方案1】:

    我会这么理解

    所有x 的列表,使得(y, x) 来自ba == y

    另一种阅读方式,更顺序:

    b 中抽取对(y, x)。对于每个这样的对,检查是否a == y。如果是,则产生x;否则,请继续下一个。

    我还应该注意变量名称有点混乱。在 Haskell 中,给列表或其他容器提供复数名称是惯用的。所以更像是

    find a abs = [x | (y, x) <- abs, a == y]
    

    【讨论】:

      【解决方案2】:

      您似乎将“x|x”视为一个事物。相反,列表推导是这样工作的:

      [ 表达式返回 | 东西以迭代 ]

      您的示例基本上说的是“从b 中抽取(x, y),丢弃任何不满足a == y 的内容,然后返回x”。

      【讨论】:

        【解决方案3】:

        让我们举一个例子来形象化它:

        find a b = [x|(y,x) <- b, a==y]
        

        a=2,b=[(1,3),(2,4),(3,5),(2,7)]

        (y,x) 将每个(1,3),(2,4),(3,5),(2,7) 作为一对,并检查第一个元素是否等于2(我们说a 等于2)。如果为 True,该函数将返回该对的第二个元素 - x,并将其与其余答案一起放入一个列表中。

        所以该函数的输出将是[4,7]

        【讨论】:

          猜你喜欢
          • 2012-03-01
          • 2021-06-24
          • 2010-10-17
          • 2018-11-30
          • 2015-01-13
          • 2013-05-15
          • 1970-01-01
          • 2023-04-08
          • 2011-08-25
          相关资源
          最近更新 更多