簡體   English   中英

haskell所有功能

[英]haskell all function

我需要一個程序來檢查所有元素對之間的差異是否在-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 _
   = []

還是我做錯了什么?

為此,使用列表推導或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)] pairsOf [1,2,3] [(1,1),(1,2),(1,3),(2,1),(2,2),(2,3),(3,1),(3,2),(3,3)]

現在,您可以在單線\\(x, y) -> x - y定義一對之間的差異,並將其映射到列表中:

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

現在,您只需要確保differences lst中的每個元素都在-22之間。

當然,這只是一種可行的方法。 還有許多其他方法。

做您描述的天真的方法是:

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

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

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

為什么不簡單...

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

或者,如果您真的想調查每一對,則可以使用monad:

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

Control.Applicative liftA2也可以。

好吧,問題說明不是很清楚。

你說:

所有元素之間的差異介於-2到2(> = -2 && <2)之間

但是也:

敵人的例子,[1,2,3]為True,但[1,3,4]為False

[1,2,3]的真實情況如何?

假設您的意思是-2 <= diff <= 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

基本上,是的,您做錯了什么。 all都意味着要使用一個謂詞和一組值進行測試。 因此,當且僅當將所有值應用於給定謂詞函數時所有結果都為true時,它將返回True 即:

allValuesEven = all even
allValuesOdd  = all odd

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM