Попытаюсь объяснить, что я хочу, поскольку не знаю, в каком разделе математики копать.
Идея выглядит так: class Dom a where dom :: [a]
Возьмем тип Bool. Для него будет dom = [False, True] .
Возьмем Maybe Bool. Для него dom = [Nothing, Just False, Just True] .
Теперь будем брать потенциально бесконечные множества.
Например, Integer. Для него dom
(
Read more... )
instance (Dom a, Dom b) => Dom (a, b) where
dom = diagonal [[(a, b) | a <- dom] | b <- dom]
diagonal :: [[a]] -> [a]
diagonal = concat . stripe where
stripe [] = []
stripe ([]:xss) = stripe xss
stripe ((x:xs):xss) = [x] : zipCons xs (stripe xss)
zipCons [] ys = ys
zipCons xs [] = map (:[]) xs
zipCons (x: xs) (y: ys) = (x: y): zipCons xs ysdiagonal определена в Control.Monad.Omega
Reply
Leave a comment