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

无法匹配Integer与Double?创建Rectangle时的类型错误排查

解决Haskell中Shape类型调用的类型不匹配问题

嘿,我来帮你搞定这个错误~先拆解一下问题根源:

你的错误提示很明确:无法匹配类型 (Integer, Integer)' 与 Double',核心问题是你给Rectangle构造器传的参数类型完全不对。

先理清楚你的类型定义逻辑

你定义的Shape里,Rectangle的构造器是Rectangle Side Side——这意味着它需要两个单独的Side类型值,但你调用的时候传了一个(5,7)这样的元组(类型是(Integer, Integer)),而且从错误看你的Side应该是被定义成了Double(比如type Side = Double),这就导致了三重不匹配:元组 vs 单个值、Integer vs Double、参数数量也不对。

两种解决方向,看你的实际需求

方向1:你确实想给Rectangle传宽高(Side是宽高)

如果Side代表的是矩形的宽和高,那你应该给Rectangle传两个单独的Double值,而不是把它们包成元组:

-- 假设你有 type Side = Double
shapeToPic (Rectangle 5.0 7.0) -- 正确:传两个Double类型的Side值

如果不想写.0,可以用fromIntegral把整数转成Double:

shapeToPic (Rectangle (fromIntegral 5) (fromIntegral 7))

方向2:你其实想给Rectangle传对角顶点(用Point)

如果你的本意是给矩形传两个坐标点(比如左上角和右下角),那你需要先修改Shape的定义,把Rectangle的参数改成Point类型:

-- 先定义Point类型(假设是(Double, Double))
type Point = (Double, Double)
type Side = Double

-- 修改Shape的Rectangle构造器
data Shape = Rectangle Point Point | Ellipse Side Side | Polygon [Point] | Line Point Point deriving (Show)

-- 同时调整shapeToPic的实现(比如根据两个点计算宽高传给rectangle函数)
shapeToPic :: Shape -> Picture
shapeToPic (Line a b) = polyline [a, b]
shapeToPic (Rectangle (x1,y1) (x2,y2)) = rectangle (abs $ x2 - x1) (abs $ y2 - y1)

这时候调用就可以传点的元组了(记得转成Double):

shapeToPic (Rectangle (5.0, 7.0) (10.0, 15.0))

最后再敲个重点

调用构造器的时候一定要严格匹配它的参数列表:Rectangle Side Side需要两个单独的Side值,不是一个元组;如果要传点,就得先修改构造器的参数类型。

内容的提问来源于stack exchange,提问作者goat

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 07:12:19