2017-09-21 11 views
0

集合内の要素の数を返す関数haskellに再帰関数のサイズを書く。ライブラリ関数の長さを使用しないでください。集合内の要素の数を返すHaskell再帰関数のサイズ

size :: Set a -> Int 

これは私がこれまで行ったことです。それは正しく見えるのですか、私は質問が何を求めているのか誤解していますか?しかし、あなたのコードを説明できることが重要で、コードのほかに

size :: Set a -> Int 
size [] = 0     -- zero 
size (_:xs) = 1 + size xs

です:空のリスト[]はサイズ0、そうしたという事実:ありがとう

size :: Set a -> Int 
    size [] = 1 
    size (_:xs) = 1 + size xs 
+1

質問には、「Set」の定義がありません。 'set Set = []'と宣言されていれば、コードは一番正しいです。あなたは基本ケースを調整する必要があります - 空のセットのサイズは0でなければなりません(演習として考えるべきことのいくつかの提案:どのようにこの関数を尾を再帰的にするでしょうか? ?この機能を折り畳み式で表現できますか?) –

+0

ありがとうございます。はい、 'size'は' set a = [a] 'と言ったように宣言されています。私はあなたの提案を見ていきます。 – carl123

答えて

0

は、私はあなたが一つの重要な部分を忘れてしまったと思います。最初の節は次のように説明できます。

"空のリストのサイズはゼロです。"

一方再帰句は、のように説明することができる。

非空リストのサイズは、1プラス組のサイズから1つのを引いた要素(ヘッド)と同じです。

ここでは、タイプSet a[a]と同じであることを前提としています。しかしこれは、重複したエントリを持つセットを持つことができることを意味します。私たちが望んでいない場合は、一意性フィルタを使うべきです。私たちは、そのためのnub :: Eq a => [a] -> [a]を使用することができ、または私達は私達のsize機能でそれを実装することができます

size :: Set a -> Int 
size = size' [] 
    where size' _ [] = 0 
      size' l (x:xs) | elem x l = size' l xs 
         | otherwise = 1 + size' (x:l) xs 
0

一つの可能​​な解決策を高階関数を使用して:

size :: Set a -> Int 
size = sum . fmap (const 1) 

SetFoldableのインスタンスであるので、これは動作し、 Functorのインスタンスにすることができます。

関連する問題