为什么这两个表达式不相等并且一个给出错误?

时间:2019-01-26 21:54:38

标签: function haskell functional-programming

--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"

没有给出错误。 为什么会这样?

1 个答案:

答案 0 :(得分:5)

Int是一个类型,而不是类型类,因此Int b不是有效的约束。您在b上需要什么约束

  1. 您同时使用b<=的{​​{1}},因此>=必须具有b约束。
  2. 您使用Ord,因此b - 1必须具有b约束。

但是,由于Numb-1的第二个参数,因此您对(!!) :: [a] -> Int -> a的类型实际上没有任何余地:b必须是一个b - 1Int也是如此。因此,类型应该简单地是

b

由于elementAt :: [a] -> Int -> a 同时具有IntNum实例,因此可以满足上面列出的要求。