symClosure函数编译错误求助:类型不匹配问题排查
解决你的Haskell编译错误
看起来你遇到的是典型的类型不匹配问题,我们一步一步拆解清楚:
错误原因分析
先看你的函数签名:symClosure :: [(a, a)] -> [(a, a)],这说明函数接收一个二元组的列表,返回的也是同一个类型的列表。
但你的实现symClosure xs = [xs ++ (flips xs)]犯了一个小疏忽:
xs ++ flips xs的结果已经是[(a,a)](两个同类型列表拼接后的正常结果)- 你又用方括号
[]把这个结果包了起来,导致最终返回值变成了[[(a,a)]](一个包含列表的列表)
这就和函数签名要求的返回类型完全不匹配了——编译器期望你返回[(a,a)],但你返回的是嵌套列表,所以才会抛出“无法匹配预期类型(a, a)与实际类型[(a, a)]”的错误(本质是方括号内本该放单个二元组,你却放了一整个列表)。
修复方案
只需要去掉外层的方括号,直接返回拼接后的列表即可:
symClosure xs = xs ++ flips xs
额外优化建议(可选)
如果你的flips函数是用来生成原二元组的逆序(比如把(x,y)转为(y,x)),那么拼接后的列表可能会包含重复元素(比如原列表里已经存在(y,x)的情况)。如果需要得到严格意义上的对称闭包(无重复元素),可以借助Data.List里的nub函数去重:
import Data.List (nub) symClosure xs = nub $ xs ++ flips xs
这样就能保证返回的对称闭包没有冗余的二元组啦。
内容的提问来源于stack exchange,提问作者CB17
相关产品推荐
相关产品推荐

