如何让当前编写的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
相关产品推荐
相关产品推荐

