【问题标题】:Run a list of functions on a list's respective elements [closed]在列表的各个元素上运行函数列表[关闭]
【发布时间】:2022-01-11 02:24:45
【问题描述】:

我必须实现一个(n)[a -> b] -> [a] -> [b] 函数,该函数必须在第二个列表的各个元素上运行给定的函数。 例如:

函数列表 [\x->x+2] [2] == [4]

函数列表 [\x->x+2, \x->x-2, \x->x*2] [2,3,6] == [4,1,12]

到目前为止,我有这个:

functionList f xs = [ f x | x <- f ]

返回类型匹配错误,我不知道该怎么办。

【问题讨论】:

  • 你必须遍历f x。您可能想要使用zip 函数。 functionList fs xs = ...,其中... 将使用zip fs xs
  • 或者,您可能想要使用zipWith

标签: list haskell


【解决方案1】:

您可以使用zip :: [a] -&gt; [b] -&gt; [(a,b)] 来简化问题。如果您想直接使用它,它可能看起来像 a = (map (uncurry ($))) . zip,但 zipWith 是您应该使用的正常快捷方式。

另一种选择是使用ZipList (docs)。

import Control.Applicative (ZipList(..))

-- I'm just writing this in the text box; i haven't checked if it parses.
a fs xs = getZipList $ ($) <$> (ZipList fs) <*> (ZipList xs)

ZipList 对于这种非常简单的情况,可能是最糟糕(最冗长,没有清晰优势)的解决方案。

当然,您也可以通过列表结构上的模式匹配来重新实现 zip。我不希望这样做有什么好处,但是如果zip 对您来说是新的,那么您应该花一点时间写出这两个版本,只是为了练习/理解。

a [] _ = []
a _ [] = []
a (f:fs) (x:xs) = ...

【讨论】:

    【解决方案2】:

    @ShapeOfMatter's excellent answer 相比略有改进的是:

    import Control.Applicative (ZipList(..))
    
    a :: [a -> b] -> [a] -> [b]
    a fs xs = getZipList (ZipList fs <*> ZipList xs)

    【讨论】:

      【解决方案3】:

      您可以使用并行列表推导:

      {-# LANGUAGE ParallelListComp #-}
      
      functionList fs xs = [f x | f <- fs | x <- xs]
      

      【讨论】:

        【解决方案4】:

        您是否希望每次遇到堆栈溢出时都需要询问并获得答案,或者您想学习如何自己编写代码?能够自己处理错误?学习如何自己修复它们?如果是这样,那么首先在您的问题中包含错误消息。然后我们可以向您展示如何使用错误作为修复代码的指南。学习 Haskell 的重点不是要记住它的库函数,而是要掌握基础知识,这样代码才能真正为你自己编写。 然后你可以记住和使用库函数。

        但即使没有错误消息,从示例中是否清楚

        functionList [\x->x+2] [2] == [4] == [(\x->x+2) 2]
        

        functionList [\x->x+2, \x->x-2, \x->x*2] [2,3,6] 
          ==  [4,1,12]
          ==  [(\x->x+2) 2, (\x->x-2) 3, (\x->x*2) 6]
        

        ?然后

        functionList [\x->x-2, \x->x*2] [3,6] 
          ==  [1,12]
          ==  [(\x->x-2) 3, (\x->x*2) 6]
        

        等等

        functionList [\x->x+2, \x->x-2, \x->x*2] [2,3,6]
          == [(\x->x+2) 2] ++ [(\x->x-2) 3, (\x->x*2) 6]
          == [(\x->x+2) 2] ++ functionList [\x->x-2, \x->x*2] [3,6]
        

        ?也就是说,

        functionList (
              (\x->x+2)    :              [\x->x-2, \x->x*2]      ) 
                     (  2  :                                 [3,6])
          == ((\x->x+2) 2) : functionList [\x->x-2, \x->x*2] [3,6]
        

        ?并且所有这些真的 是否取决于此处使用的特定 值,或者它是否适用于任何 函数f,g,@987654328 @, ... 以及它们的参数 -- 任意 个?

        那么可以概括吗?

        【讨论】:

          猜你喜欢
          • 2022-07-07
          • 2017-11-04
          • 1970-01-01
          • 2021-01-23
          • 1970-01-01
          • 2020-12-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多