--Find kth element of list
elementAt :: (Int b) => [a] -> b -> a
elementAt a b = case a of [] -> error "Empty List"
a -> if (length a) <= b && b>=1 then a !! (b- 1) else error "Wrong index"
给出错误Expected kind -> constraint but Int has kind *
。
相比:
elementAt :: [a] -> Int -> a
elementAt a b = case a of [] -> error "Empty List"
a -> if (length a) <= b && b>=1 then a !! (b- 1) else error "Wrong index"
没有给出错误。 为什么会这样?
答案 0 :(得分:5)
Int
是一个类型,而不是类型类,因此Int b
不是有效的约束。您在b
上需要什么约束 ?
b
和<=
的{{1}},因此>=
必须具有b
约束。Ord
,因此b - 1
必须具有b
约束。但是,由于Num
是b-1
的第二个参数,因此您对(!!) :: [a] -> Int -> a
的类型实际上没有任何余地:b
必须是一个b - 1
,Int
也是如此。因此,类型应该简单地是
b
由于elementAt :: [a] -> Int -> a
同时具有Int
和Num
实例,因此可以满足上面列出的要求。