isListEmpty ::((a -> Bool) -> [a] -> [a]) -> Bool
isListEmpty f | length f == 0 = True
| otherwise = False
你的函数的第一个参数isListEmpty是一个你给它的名字f和它的类型的函数,(a -> Bool) -> [a] -> [a].你f输入length这个函数失败了,因为这个函数length接受带有签名的[a]类型并产生一个 type Int。
您可以通过转到 ghci 并键入:t lengthwhich来查看这一点[a] -> Int。
如果您首先将 f 应用于具有类型的列表,[a]那么您可以使用lengthand==0检查它是否为空。然而,该函数null是测试列表是否为空的惯用方法,因此我建议改用它。
编辑添加如何编写类似函数的示例。
假设我想在执行另一个函数(如 drop 或 init 等)之后找到列表的长度。首先只需完整地编写包含所有参数的函数:
manipulateList :: ([a] -> [a]) -> [a] -> Int
manipulateList fn lst = length (fn lst)
而不是length (fn lst)我们可以用函数组合重写它(length.fn) lst
manipulateList :: ([a] -> [a]) -> [a] -> Int
manipulateList fn lst = (length.fn) lst
现在您可以像使用代数方程一样取消lst两边。
manipulateList :: ([a] -> [a]) -> Int
manipulateList fn = (length.fn)
现在我们有一个高阶函数,它接受一个函数fn并在fn应用于它之后找到列表的长度。