6

让我们说

  flip :: (a->b->c) ->b->a->c
  const ::d->e->d

(flip const) 的类型是

  a=d,b=e,c=d

  b->a->c

所以类型是

  e->d->d

但是对于(地图拍摄)它

  [Int]->[[a]]->[[a]]

所以我不明白这个 ghci 是如何计算的。我理解 [[a]]->[[a]] 但为什么以及如何 [Int] ?

编辑:例如,如果我们用 ghci 编写

  :t flip const 


it would return b->c->c

ghci 会像我一样计算它。

 map :: (a->b)->[a]->[b]
 take :: Int->[c]->[c]

那为什么要取地图

  [Int]->[[a]->[a]]

为什么 [Int] ghci 是如何计算的

4

2 回答 2

14

让我们做同样的分析:

map :: (a -> b) -> [a] -> [b]

take :: Int -> [x] -> [x]

但这实际上意味着

take :: Int -> ([x] -> [x])

所以 你a=Int得到b=([x] -> [x])

map take :: [Int] -> [ [x] -> [x] ]

列表函数列表!

于 2013-05-19T18:08:46.877 回答
12

您应该复制并粘贴您看到的类型,而不是将它们重新输入到问题中。原因是你看错了。的类型map take是:

map take :: [Int] -> [[a] -> [a]]

换句话说,统一是这样工作的:

:t map
map :: (a -> b) -> [a] -> [b]
:t take
take :: Int -> [c] -> [c]

所以当你take作为第一个参数应用时,map你会得到a ~ Intand b ~ [c] -> [c](注意这是一个函数)。在类型中执行这些替换map并应用第一个参数:

map take :: [a] -> [b]        (for some specific 'a' and 'b')
-- recall a ~ Int
map take :: [Int] -> [b]      (for some specific 'b')
-- recall b ~ [c] -> [c]
map take :: [Int] -> [[c] -> [c]]

是的,map take这正是你所期望的。一个对 Ints 列表进行操作并生成一个函数列表的函数,该列表将从列表的开头获取一些元素。

于 2013-05-19T18:11:42.847 回答