其逆似乎是可能的。
由于我认为列表是产品,而->是幂,(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

这个答案基本上等效于copumpkinleftroundabout的答案的注释,但是不是使用类型来实现它,而是手动传递(固定)长度信息。如果您稍微使用updn,您将了解为什么这种情况通常不适用于列表。

09-30 16:50
查看更多