PureScript添加函数类型定义后出现类型不匹配错误咨询
解决List Int与Int类型不匹配的编译错误
嗨,我来帮你理清这个编译错误的问题~
首先,咱们先聚焦到你遇到的核心问题:你给squareOf函数写的类型签名,和函数实际的返回值类型完全不匹配,这才导致了编译器报错。
问题拆解
先看你的函数实现:
squareOf ls = map (\n -> n * n) ls
这个函数的逻辑很清晰:接收一个整数列表,用map把每个元素平方,最后返回的是一个新的整数列表——也就是说,它的输入是List Int,输出也是List Int。
但你给它加的类型签名是:
squareOf :: List Int -> Int
这里你明确告诉编译器“这个函数要返回单个Int值”,但函数实际返回的是平方后的元素列表(List Int)。编译器当然会懵:它没办法把一个列表类型强行匹配成单个整数类型,这就是错误信息里Could not match type List Int with type Int的由来。
修复方案
只需要把类型签名改成和函数实际行为一致的就行:
squareOf :: List Int -> List Int squareOf ls = map (\n -> n * n) ls
这样编译器就能正确识别函数的输入输出类型,编译自然就能通过了。
顺便说下你REPL里的mm函数
你在REPL里写的:
mm n = (\n -> n * 2) <$> n
这里的<$>是Functor类型类里的fmap操作,对于List来说,它和map的作用完全一样——所以mm的功能是把列表里每个元素乘2,返回新列表。不过你写的调用mm (2:3:Nil) (4 : 6 : Nil)应该是笔误?因为mm只定义了一个参数,这样调用会提示参数数量不匹配,正确的调用应该是只传一个列表,比如mm (2:3:Nil),会得到4:6:Nil。
总结一下:写类型签名的时候,一定要确保签名里的返回类型和函数实际产出的值的类型完全对齐,不然编译器就会抛出这类类型不匹配的错误啦。
内容的提问来源于stack exchange,提问作者roundcrisis
相关产品推荐
相关产品推荐

