首先,你的代码可以运行。但是函数无法获得show n。尝试使用show id,你最终会得到非常相似的错误消息。
但在深入研究您的功能列表应用之前,让我们先看一下类型,以检查您的逻辑是否正确。为了简单起见,我们说1 :: Int。同时,\x -> take x 可以被简化为take,因此我们可以通过map take [1..5]来重现您的行为。现在我们在小型类型混乱中有以下参与者:
map :: (a -> b ) -> [a] -> [b]
take :: Int -> ([c] -> [c]) -- explicit parentheses
现在我们将take
插入map
。在我们的map
中,由于take
的第一个参数,a~Int
,而b~[c]->[c]
。因此,我们有:
map take :: [Int] -> [[c] -> [c]]
现在我们使用map take [1..5]
,它只是简单地在上一行中删除类型:
map take :: [Int] -> [[c] -> [c]]
[1..5] :: [Int]
map take [1..5] :: [[c] -> [c]]
我们完成了。最终得到的类型与您的错误信息完全相同。一切都结束得很好吗?是的。您的代码没有问题。
然而,正如已经提到的,[[c] -> [c]]
无法显示。我们必须在列表中应用这些函数:
Prelude> map (\f -> f [1..10]) (map take [1..5])
[[1],[1,2],[1,2,3],[1,2,3,4],[1,2,3,4,5]]
:t
来请求其类型。这应该可以正常工作。 - kosmikusmap take [1..5]
同样有效。 - phipsgabler