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 length
which来查看这一点[a] -> Int
。
如果您首先将 f 应用于具有类型的列表,[a]
那么您可以使用length
and==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
应用于它之后找到列表的长度。