You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让当前编写的Haskell函数顺利通过类型检查

问题根因

Haskell要求同一case表达式的所有分支返回完全相同的类型,你的两个分支分别返回(Int, Int)和(Int, Char),类型不匹配才触发了类型错误。而你最终要的其实是两个值转为字符串后的拼接结果,完全可以在case分支内就把两个元素都转为String,统一元组类型即可解决问题。

最简修正方案

直接在每个case分支里完成值到String的转换,保证两个分支返回的都是(String, String)类型,代码如下:

data D = A Int Int | B Int Char

instance Show D where
    show (A a b) = show b
    show (B a b) = show b

hehe :: D -> String
hehe d = u ++ v
     where (u, v) = case d of 
            A a b -> (show $ a + 1, show b)
            B a b -> (show $ a + 2, show b) 
可选扩展方案

如果你确实想保留「对元组统一应用show函数」的写法,可以借助存在类型包装可展示值,不过这种写法需要开启ExistentialQuantification扩展,非必要不推荐使用,示例如下:

{-# LANGUAGE ExistentialQuantification #-}

data Showable = forall a. Show a => Showable a
instance Show Showable where show (Showable x) = show x

data D = A Int Int | B Int Char

instance Show D where
    show (A a b) = show b
    show (B a b) = show b

hehe :: D -> String
hehe d = show u ++ show v
     where (u, v) = show <$> case d of 
            A a b -> (Showable $ a + 1, Showable b)
            B a b -> (Showable $ a + 2, Showable b) 

内容的提问来源于stack exchange,提问作者Hải Bình

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 03:36:02