Haskell中‘<=被应用至6个参数’错误的原因咨询
问题分析与解决:Haskell函数中的逻辑运算错误
错误根源
你遇到的错误核心是误用了逻辑与操作符:
- 在Haskell中,
and是处理布尔列表的函数(类型为[Bool] -> Bool),作用是判断列表中所有元素是否为真,比如and [True, False]返回False。 - 而你需要的是连接单个布尔表达式的短路逻辑与操作符,正确的写法是
&&。
当你用and连接三个布尔表达式时,Haskell会按函数应用的优先级解析:
- 先把
(x-prev <= -1)作为第一个参数传给and,得到一个类型为[Bool] -> Bool的函数 - 再把
(x-prev > -3)作为第二个参数传给这个函数,直接触发类型不匹配 - 编译器为了匹配类型,错误地解析整个表达式的参数数量,最终抛出
<=被应用到6个参数的误导性错误。
修正后的代码
将所有and替换为&&即可解决问题:
isSafe :: [Int] -> Int -> Bool -> Bool isSafe [x] _ _ = True isSafe (x:xs) 0 isIncreasing = isSafe xs x isIncreasing isSafe (x:xs) prev True = (x-prev >= 1) && (x-prev < 3) && isSafe xs x True isSafe (x:xs) prev False = (x-prev <= -1) && (x-prev > -3) && isSafe xs x False
可选优化:简化条件判断
可以用abs统一差值判断逻辑,让代码更简洁:
isSafe :: [Int] -> Int -> Bool -> Bool isSafe [x] _ _ = True isSafe (x:xs) 0 isIncreasing = isSafe xs x isIncreasing isSafe (x:xs) prev isIncreasing = let diff = x - prev validDiff = abs diff >= 1 && abs diff < 3 validTrend = if isIncreasing then diff > 0 else diff < 0 in validDiff && validTrend && isSafe xs x isIncreasing
内容的提问来源于stack exchange,提问作者anon_swe
相关产品推荐
相关产品推荐

