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

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的错误。

修复步骤

  1. 修正模式匹配语法
    正确的写法是把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))
    
  2. 补充非穷尽模式的分支
    你的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 04:12:32