Haskell类型不匹配错误排查:无法匹配‘b’与Int类型
错误原因与修复方案
错误原因
Haskell 是强类型静态语言,要求函数的所有分支返回完全一致的类型。你的prel函数中存在类型不匹配问题:
- 当
y是偶数时,y/2的结果属于Fractional b类型(符合函数签名的预期返回类型); - 当
y是奇数时,y*2的结果是Int类型,和预期的b类型冲突。
Haskell 无法自动将Int隐式转换为任意的Fractional类型,因此编译器抛出Couldn't match type 'b' with Int的错误。
修复方案
使用fromIntegral函数将Int类型的y转换为Fractional b类型,确保两个分支的返回类型一致:
prel2 :: (Fractional b) => [Int] -> [b] prel2 x = map prel x where prel y | even y = fromIntegral y / 2 | otherwise = fromIntegral y * 2
简化写法
你也可以用 lambda 表达式简化代码,逻辑完全一致:
prel2 :: (Fractional b) => [Int] -> [b] prel2 = map (\y -> if even y then fromIntegral y / 2 else fromIntegral y * 2)
内容的提问来源于stack exchange,提问作者Dudu Dudu
相关产品推荐
相关产品推荐

