如何在Haskell中计算类型

nbd*_*dip 6 haskell types ghci

让我们说

  flip :: (a->b->c) ->b->a->c
  const ::d->e->d
Run Code Online (Sandbox Code Playgroud)

(翻转const)的类型

  a=d,b=e,c=d
Run Code Online (Sandbox Code Playgroud)

  b->a->c
Run Code Online (Sandbox Code Playgroud)

所以类型会是

  e->d->d
Run Code Online (Sandbox Code Playgroud)

但是(地图拍摄)它

  [Int]->[[a]]->[[a]]
Run Code Online (Sandbox Code Playgroud)

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

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

  :t flip const 


it would return b->c->c
Run Code Online (Sandbox Code Playgroud)

和ghci会像我一样计算出来.

 map :: (a->b)->[a]->[b]
 take :: Int->[c]->[c]
Run Code Online (Sandbox Code Playgroud)

那么为什么地图需要

  [Int]->[[a]->[a]]
Run Code Online (Sandbox Code Playgroud)

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

And*_*ewC 14

我们做同样的分析:

map :: (a -> b) -> [a] -> [b]
Run Code Online (Sandbox Code Playgroud)

take :: Int -> [x] -> [x]
Run Code Online (Sandbox Code Playgroud)

但这实际上意味着

take :: Int -> ([x] -> [x])
Run Code Online (Sandbox Code Playgroud)

因此,与a=Intb=([x] -> [x])

map take :: [Int] -> [ [x] -> [x] ]
Run Code Online (Sandbox Code Playgroud)

列表函数列表!


Tho*_*son 12

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

map take :: [Int] -> [[a] -> [a]]
Run Code Online (Sandbox Code Playgroud)

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

:t map
map :: (a -> b) -> [a] -> [b]
:t take
take :: Int -> [c] -> [c]
Run Code Online (Sandbox Code Playgroud)

所以在申请时take作为第一个参数mapa ~ Intb ~ [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]]
Run Code Online (Sandbox Code Playgroud)

耶,map take正是你所期望的.一个在Ints列表上运行的函数,它产生一个函数列表,这些函数将从列表的开头获取一些元素.

  • 这是非常相关的https://docs.google.com/file/d/1oTZkzY1MiQwUAdoW3E5Fsb7p6AYRU4ph9BrR17TC-Qrzh-6vHUS6mRatgZhL/edit?usp=sharing (2认同)
  • 统一不是Haskell特定的概念,它是一个更通用的术语:http://en.wikipedia.org/wiki/Unification_ (computer_science) (2认同)