【发布时间】:2021-08-11 13:41:57
【问题描述】:
谁能帮我理解这个问题。
我有这个简单的功能:
takeAsLong :: [a] -> (a -> Bool) -> [a]
takeAsLong [] _ = []
takeAsLong (x:xs) test | test x = x : takeAsLong xs test
| otherwise = []
但是当我尝试使用 if-then-else 重写它时,我遇到了错误。
takeAsLong :: [a] -> (a -> Bool) -> [a]
takeAsLong [] _ = []
takeAsLong (x:xs) test = if test x then x : takeAsLong [xs] test else []
错误在“takeAsLong [xs] test”的递归调用中,但我不明白为什么它不喜欢它?
错误信息:
无法将类型“a”与“[a]”匹配 预期:[a] -> Bool 实际:a -> Bool ‘a’ 是一个刚性类型变量,由 类型签名: takeAsLong::forall 一个。 [a] -> (a -> Bool) -> [a]
那么为什么它期望函数测试是[a] -> Bool 以及为什么带有保护的版本没有同样的问题?
【问题讨论】:
标签: haskell