2012-01-03 47 views
0

これは私の宿題の小さな部分です。リストの要素を数えなければならず、数== 2ならtrueを返します。そのリストの要素は固定されていませんが、異なる機能などのを使用してフィルタリングされます(例:allNumbers)。私はこの既存の関数を使って2つの要素があるかどうかを調べなければなりません。リストの要素をカウントする(haskell)

チェック機能の定義は次のようになります。

isTrue :: Int -> Bool 

私は、現在の機能は、これがないことのリストのn分割のすべての数字である

divisors :: Int -> [Int] 
divisors n | n < 1 = [] 
      | otherwise = filter (\k -> n `mod` k == 0) [1..n] 

を定義しています。今私は別の関数を作成する必要があります上記の関数によって生成されるリストに2つだけの数字がある場合、trueとなる同じプログラムでTrueです。

+0

'divisors'によって生成されるリストは、' Int'のリストと言われるので、数字だけを含むことができます。あなたは「[...]は* 2 *数字しか持っていませんか?あなたの返信に感謝します。 – phimuemue

+0

はい、リストはIntのリストです、私は意味しています。除数は、除数によって生成されたリストに2つの要素しか含まれていない場合、真を返す別の関数です。だから私はそれがn> 1の条件になると推測していますが、今ここでそれを実装する方法は確かです。 – Amjad

答えて

7

私の知る限り、リストを取得してブール値を返す関数が必要です。このように、署名は次のようになります。

doit :: [a] -> Bool 

doit (x:y:z) = True -- matches if the list contains at least 2 elements 
doit _ = False  -- matches otherwise (i.e. list has 0 or 1 element) 

-- or, we match only if the length is exactly 2 

newdoit :: [a] -> Bool 
newdoit [a,b] = True 
newdoit _ = False 

-- or even more elegant 
simpledoit l = (length l)==2 

-- the complete function is then e.g. 
completefunc l = newdoit (divisors l) 
+0

私は私の質問で間違いを犯しました。関数isTrueは、リストのカウントが2ならば真を返すと想定されます。それ以外のものはfalseです。ありがとう。 – Amjad

+0

[Int]または[a]の代わりに他の関数の結果(リスト)を使用するにはどうすればよいですか? – Amjad

+1

'simpleedoit(otherfunction mylist)'、btw:あなたはこれを知っていますか? http://learnyouahaskell.com/chapters – phimuemue

0
length' xs = case ((length xs) > 2) of 
        True -> True 
        _ -> False 
+0

さて、少なくとも長さxs =(長さxs)> 2にしてください。 – ShiDoiSi

4

私は、ソリューション全体を離れて与えたくないが、私はそれを指摘する価値だと思うことにlength機能を使用して、いくつかの解決のために行く以外にもリストの長さを計算してから適切な結果を得るには、(2)と比較する長さがかなり小さいので、pattern matchingを使用することも考えられます。だから、これの

hasLengthOfTwo <pattern_matching_lists_with_two_elements> = True 
hasLengthOfTwo _ = False 
のようなもの

小さな(おそらく無関係)の利点は、それはまた、無限リストの上に動作することです。

関連する問題