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=Int和b=([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作为第一个参数map你a ~ Int和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]]
Run Code Online (Sandbox Code Playgroud)
耶,map take正是你所期望的.一个在Ints列表上运行的函数,它产生一个函数列表,这些函数将从列表的开头获取一些元素.