无法在Haskell中将类型'a'与'Int'匹配

CYC*_*CYC 0 haskell

place n x意味着n在列表中找到整数的位置x,例如place 2 [1,2,3]将返回1:

place :: Int -> [a] -> Int
place n x = length $ takeWhile (/=n) x
Run Code Online (Sandbox Code Playgroud)

但它得到了错误 Couldn't match type ‘a’ with ‘Int’

为什么?takeWhile应该返回一个列表,它的长度是一个整数,因此place应该Int最终输出.

Eri*_*ikR 7

正确的类型签名place是:

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

当你使用[a]代替[Int]你时,你会说这place将适用于任何类型的列表.例如,我可以这样称呼它:

place 3 [True, False, False, True]
Run Code Online (Sandbox Code Playgroud)

或者用Char列表调用它:

place 4 "this is a test"
Run Code Online (Sandbox Code Playgroud)

但这些都不能起作用,因为它takeWhile会将列表中的每个元素与Int进行比较n.这会强制列表成为Ints列表.