Haskell中Rectangle构造函数参数错误:应传入2个参数却未传入的原因及修复方案
分析与修复Haskell代码中的构造器参数错误
咱们先直接拆解这个错误的核心:你遇到的编译问题,本质是模式匹配的语法写错了。
在你的代码里,Points类型的Rectangle构造器需要接收2个Point参数,但你在inPoints函数里的写法是:
inPoints (x, y) Rectangle (x1, y1) (x2, y2) = ...
这里编译器会把Rectangle当成inPoints的第三个独立参数,而不是第二个参数(Points类型)的构造器——相当于你凭空丢了一个Rectangle构造器,却没给它传任何必要参数,这就触发了The constructor 'Rectangle' should have 2 arguments, but has been given none的错误。
修复步骤
修正模式匹配语法
正确的写法是把Rectangle构造器作为第二个参数的完整模式,用括号包裹起来,明确告诉编译器:第二个参数是Points类型的Rectangle实例,它包含两个Point值。修正后的Rectangle分支代码如下:inPoints (x, y) (Rectangle (x1, y1) (x2, y2)) = ((inMin x1 x2) <= x && x <= (inMax x1 x2)) && ((inMin y1 y2) <= y && y <= (inMax y1 y2))补充非穷尽模式的分支
你的Points类型还有Union和Difference两个构造器,当前代码只处理了Rectangle,后续编译器会报非穷尽模式的错误。咱们需要补充这两个分支的逻辑,比如:Union:点在任意一个子区域内就算命中Difference:点在第一个区域内,但不在第二个区域内
完整修复后的代码
type Point = (Int, Int) data Points = Rectangle Point Point | Union Points Points | Difference Points Points inMax :: Int -> Int -> Int inMax a b | a < b = b | otherwise = a inMin :: Int -> Int -> Int inMin a b | a < b = a | otherwise = b inPoints :: Point -> Points -> Bool -- 修正后的Rectangle分支 inPoints (x, y) (Rectangle (x1, y1) (x2, y2)) = ((inMin x1 x2) <= x && x <= (inMax x1 x2)) && ((inMin y1 y2) <= y && y <= (inMax y1 y2)) -- 补充Union分支:点在任意一个子区域内 inPoints p (Union p1 p2) = inPoints p p1 || inPoints p p2 -- 补充Difference分支:点在第一个区域,且不在第二个区域 inPoints p (Difference p1 p2) = inPoints p p1 && not (inPoints p p2)
这样代码就能正常编译,并且完整实现了你定义的Points类型的所有区域判断逻辑。
内容的提问来源于stack exchange,提问作者Fane Spoitoru
相关产品推荐
相关产品推荐

