是否可以在haskell中编写一个函数:(r - > [a]) - > [r - > a])?

use*_*010 3 haskell types inverse

它的倒数似乎有可能.因为我想象列表是产品并且->是取幂, (a*a*a...)^r = (a^r)*(a^r)....

既然我们可以定义逆,[a->r] -> a -> [r]那么不应该定义它吗?

lef*_*out 8

[a] ? a*a*...仅适用于无限列表.对于这些,您所请求的功能实际上非常简单,尽管天真的实现效率不高:

type InfiList = []

unwind :: (r -> InfiList a) -> InfiList(r -> a)
unwind f = [ \x -> f x !! n | n <- [0..] ]
Run Code Online (Sandbox Code Playgroud)

实际上,[a] ? 1 + a * (1 + a * (1 + ...)); 这里的幂律不起作用.

  • @ user3585010:如果列表有限,你会怎么做?例如,让我们想象一个函数`Int - > [Bool]`返回`[]`除了`100`,它返回`[True,False]`.你期望得到的`[Int - > Bool]`列表包含什么? (5认同)
  • 对于给定大小的有限列表(如由长度索引的"Vec")或无限流可能.它们的共同点(和`List`没有)是它们都可以表示为索引集中的函数.`Vec na≅Fin n - > a`和`Stream a≅Nat - > a`.在这种情况下,问题减少到调用`flip`.原始问题没有保证同质性 - 一个"r"值可以产生一个长度的列表,而另一个"r"值可以产生不同长度的列表. (5认同)