Haskell において、リストから重複を排除するサンプルコードを調べたところ、以下のようなコードを発見しました。
Haskell
1import qualified Data.Set as Set 2 3f :: Ord a => a -> (Set.Set a -> [a]) -> Set.Set a -> [a] 4f x k ss = if Set.member x ss then k ss else x : k (Set.insert x ss) 5 6g :: Ord a => [a] -> [a] 7g xs = foldr f (const []) xs Set.empty
上記のコードは、確かに正しく動作します。
> g [1, 2, 2, 3, 3, 3] [1, 2, 3]
上記のコードで、試しに g [1, 2]
としたときの動作は、以下のようになるのだろうな、と推測しています。
foldr f (const[]) [1,2] = f 1 (foldr f (const[]) [2]) = f 1 (f 2 (foldr f (const[]) []) = f 1 (f 2 (const[])) g [1, 2] = foldr f (const[]) [1,2] {} -- Set.empty = {} と考えています。 = f 1 (f 2 (const[])) {} = 1 : (f 2 (const[])) {1} = 1 : (2 : (const[]) {1, 2}) = 1 : (2 : [])) = [1, 2]
教えていただきたいことは、以下の2点です。
(1) 上記の考えは合っているでしょうか?
(2) 上記の考えで合っていたとしても、なんとなく釈然としません。もっと、すっきり理解する考え方はないでしょうか?特に、f
の k
の部分が分かりにくく感じています。
初心者の質問で大変申し訳ないですが、どうぞ宜しくお願いいたします。
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2024/12/13 08:36