1

要素のすべてのペアの差が -2 から 2 までの範囲内にあるかどうかをチェックするプログラムが必要です( >= -2 && < 2)。そうである場合は return True、そうでない場合は return 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 _
   = []

または、私は何か完全に間違っていますか?

4

5 に答える 5

3

このためには、おそらくリスト内包表記または do 表記を使用する方が簡単です。

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) -> x - yそれをリストにマップできます。

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

の各要素がdifferences lstと の間にあることを確認する必要が-2あり2ます。

もちろん、これは可能な方法の 1 つにすぎません。他にもたくさんの方法があります。

于 2012-06-12T17:16:48.223 に答える
2

あなたが説明することを行う単純な方法は次のとおりです。

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

ただし、より効率的な方法は、リストの最小値と最大値を比較することです。

fastfunc [] = true
fastfunc xs = maximum xs - minimum xs <= 2
于 2012-06-13T19:54:53.653 に答える
1

単純に...

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

または、本当にすべてのペアを調査したい場合は、モナドを使用できます。

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

liftA2からControl.Applicativeも同様に行います。

于 2012-06-13T15:37:16.353 に答える
0

さて、問題の仕様はあまり明確ではありません。

あなたは言う:

すべての要素間の差は、-2 から 2 までの範囲にあります ( >= -2 && < 2)

だけでなく:

たとえば、[1,2,3] は True ですが、[1,3,4] は False です。

[1,2,3] はどのように True ですか?

あなたが意味すると仮定すると-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
于 2012-06-12T18:10:47.107 に答える
-1

基本的に、はい、あなたは何か間違ったことをしています。allテストする述語と値のリストを取ることを意図しています。したがってTrue、指定された述語関数に適用されたときにすべての値が true になる場合にのみ、戻ります。すなわち:

allValuesEven = all even
allValuesOdd  = all odd
于 2012-06-12T17:17:45.713 に答える