Если вы хотите исправить размер списка функций, это сработает.
dn :: [r -> a] -> (r -> [a])
dn fns r = map ($ r)
up :: Int -> (r -> [a]) -> [r -> a]
up n f = tabulate n (\i r -> f' r !! i)
where
f' = cycle . f
tabulate n f = map f [0..n-1]
Теперь мы можем получить up
как "своего рода" левую инверсию dn
... при условии, что мы перемешаем некоторую информацию о длине:
id1 :: [r -> a] -> [r -> a]
id1 ls = up (length ls) (dn ls)
и это может быть «своего рода» правая инверсия dn
, если мы волшебным образом знаем (а), что для каждого r
длина списка результатов [a]
одинакова, и (б) мы знаем эту длину (называемую magic
ниже)
id2 :: (a -> [b]) -> a -> [b]
id2 f = dn . up magic
Этот ответ в основном эквивалентен комментарию copumpkin
s к ответу leftroundabout
, но вместо того, чтобы выполнять его с использованием типов, я передаю информацию о (фиксированной) длине вручную. Если вы немного поиграете с up
и dn
, вы поймете, почему такие вещи не работают для списков в целом.
person
J. Abrahamson
schedule
04.09.2014
const []
? ;) Что я имею в виду: что должна делать функция? - person   schedule 04.09.2014List A ~ 1 / (1 - A)
, и она не верна, что1 / (1 - A^R) = (1 / (1 - A))^R
- person Gabriel Gonzalez   schedule 05.09.2014