【问题标题】:haskell all functionhaskell所有功能
【发布时间】:2012-06-15 14:48:21
【问题描述】:

我需要一个程序来检查所有元素对之间的差异是否在 -2 到 2 ( >= -2 && < 2) 的区间内。如果是,则返回True,否则返回False。例如,[1,2,3]True,但 [1,3,4]False。 我正在使用all 函数。我的if 子句有什么问题?

allfunc (x : xs)
   = if all (...) xs
      then allfunc xs
      else [x] ++ allfunc xs
allfunc _
   = []

或者我做错了什么?

【问题讨论】:

  • 您应该注意,这结合了使用延续,并使用您可能写得更好的东西作为折叠。
  • 订单是否相关? [-2,0] 的输出是什么?

标签: list haskell boolean


【解决方案1】:

做你描述的事情的天真方法是:

allfunc xs = all (<=2) [abs(a-b) | a <- xs, b <- xs ]

但是,更有效的方法是比较列表的最小值和最大值:

fastfunc [] = true
fastfunc xs = maximum xs - minimum xs <= 2

【讨论】:

    【解决方案2】:

    为什么不干脆……

    allfunc xs = (maximum xs - minimum xs) <= 2
    

    或者如果你真的想调查每一对,你可以使用单子:

    import Control.Monad
    allfunc xs = all ((<=2).abs) $ liftM2 (-) xs xs
    

    来自Control.ApplicativeliftA2 也可以。

    【讨论】:

      【解决方案3】:

      基本上,是的,你做错了什么。 all 旨在采用谓词和要测试的值列表。因此,当且仅当应用于给定谓词函数时所有值都为 true 时,它​​将返回 True。即:

      allValuesEven = all even
      allValuesOdd  = all odd
      

      【讨论】:

      • 你的第一句话不正确:[] 不匹配模式x:xs
      【解决方案4】:

      嗯,问题说明不是很清楚。

      你说:

      所有元素之间的差异在 -2 到 2 的区间内 ( >= -2 &&

      还有:

      例如,[1,2,3] 为真,但 [1,3,4] 为假

      [1,2,3] 是如何成立的?

      假设你的意思是-2 &lt;= diff &lt;= 2,那么我会使用这个:

      allfunc :: (Ord a, Num a) => [a] -> Bool
      allfunc theList = all (\x -> (x >= -2) && (x<2)) [x-y | x <- theList, y <- theList ]
      
      allfunc [1,2,3] -- => True
      allfunc [1,3,4] -- => False
      

      【讨论】:

        【解决方案5】:

        为此,使用列表推导式或 do-notation 可能更容易。

        pairsOf lst = do 
          x <- lst
          y <- lst
          return (x, y)
        

        pairsOf 返回输入 lst 中的数字对列表。例如,pairsOf [1,2,3] 会产生 [(1,1),(1,2),(1,3),(2,1),(2,2),(2,3),(3,1),(3,2),(3,3)]

        现在,您可以在单线 \(x, y) -&gt; x - y 中定义一对之间的差异,并将其映射到列表中:

        differences lst = map (\(x, y) -> x - y) (pairsOf lst)
        

        现在您只需确保differences lst 中的每个元素都在-22 之间。

        当然,这只是一种可能的方法。还有很多其他方法。

        【讨论】:

        • 可以简化并执行类似的操作:diffs lst= [ (x - y) | x&lt;-lst, y&lt;-lst],然后将差异结果列表推送到checkDiffS = all (\x-&gt; x&lt;2 &amp;&amp; x&gt;-2)
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-24
        • 1970-01-01
        • 1970-01-01
        • 2018-04-21
        • 1970-01-01
        相关资源
        最近更新 更多