我一直在努力花一个小时来理解更高阶函数中的某些东西,现在我因为这个错误而无法继续前进:
hof :: [Integer] -> (Integer -> Integer)
isIn :: [Integer] -> Integer -> Integer
isIn [] s = 0
isIn [] _ = 0
isIn (h:t) s
| h == s = 0 {-<-------- error points here here-}
| otherwise = isIn(t) + 1
hof s = \n -> isIn s n
ERROR file:.\Lab2.hs:111 - Type error in explicitly typed binding
*** Term : isIn
*** Type : [Integer] -> Integer -> Integer -> Integer
*** Does not match : [Integer] -> Integer -> Integer
答案 0 :(得分:6)
您在isIn
的递归调用中缺少第二个参数;它应该是
| otherwise = isIn t s + 1
-- ^
虽然不是错误,但您也有冗余的基本情况; s
和_
都是无可辩驳的模式,因此仅isIn [] _ = 0
就足够了。
也不是错误,但hof
和isIn
之间没有区别,因为您可以将定义简化为
hof s = isIn s
再次
hof = isIn