其逆似乎是可能的。
由于我认为列表是产品,而->
是幂,(a*a*a...)^r = (a^r)*(a^r)....
由于我们可以定义反向[a->r] -> a -> [r]
,因此不应该定义它吗?
最佳答案
如果您愿意修复函数列表的大小,那么它将起作用。
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)
如果我们神奇地知道(a)对于每个
dn
,结果列表r
的长度是相同的,并且(b)我们知道该长度(以下称为[a]
),则它可以是magic
的右排序的“排序”。id2 :: (a -> [b]) -> a -> [b]
id2 f = dn . up magic
这个答案基本上等效于
copumpkin
对leftroundabout
的答案的注释,但是不是使用类型来实现它,而是手动传递(固定)长度信息。如果您稍微使用up
和dn
,您将了解为什么这种情况通常不适用于列表。