Haskell与CodeWorld API:构造函数传参方法咨询
如何为Shape和Tool构造函数传递参数?
嘿,我来帮你搞明白怎么给这些Haskell构造函数传递参数~先看你提供的Shape和Tool数据类型定义,咱们逐个构造函数来拆解说明:
一、Shape构造函数传参
你的Shape类型有四个构造函数,每个都需要对应类型的参数,具体用法如下:
Rectangle构造函数
它需要两个Side类型的参数(推测你代码里应该给Side定义了别名,比如type Side = Double,用来表示长度)。示例:
-- 创建一个宽为5、高为3的矩形 myRectangle :: Shape myRectangle = Rectangle 5 3
Ellipse构造函数
和Rectangle逻辑一致,需要两个Side参数,分别对应椭圆的长半轴和短半轴长度:
-- 创建一个长半轴4、短半轴2的椭圆 myEllipse :: Shape myEllipse = Ellipse 4 2
Polygon构造函数
需要传入一个[Point]列表,CodeWorld里的Point本质是(Double, Double)的元组别名,直接传顶点坐标列表即可:
import CodeWorld (Point) -- 可以导入Point类型,或者直接用元组 -- 创建一个三角形多边形 myTriangle :: Shape myTriangle = Polygon [(0, 0), (3, 0), (1.5, 3)]
Line构造函数
需要传入两个Point参数,分别表示直线的起点和终点:
-- 创建一条从(0,0)到(5,5)的直线 myLine :: Shape myLine = Line (0, 0) (5, 5)
二、Tool构造函数传参
Tool类型的构造函数主要用来处理绘图工具的状态,参数多为Maybe Point或顶点列表,具体用法:
RectangleTool构造函数
接受一个Maybe Point参数,Nothing表示还没选择起点,Just Point表示已经选好起点:
-- 未激活的矩形工具(还没选起点) emptyRectTool :: Tool emptyRectTool = RectangleTool Nothing -- 已激活的矩形工具(已选起点(2,2)) activeRectTool :: Tool activeRectTool = RectangleTool (Just (2, 2))
EllipseTool构造函数
和RectangleTool逻辑一致,参数为Maybe Point:
-- 未激活的椭圆工具 emptyEllipseTool :: Tool emptyEllipseTool = EllipseTool Nothing -- 已激活的椭圆工具(已选起点(0,0)) activeEllipseTool :: Tool activeEllipseTool = EllipseTool (Just (0, 0))
LineTool构造函数
同样接受Maybe Point参数,用来记录直线的起点状态:
-- 未激活的直线工具 emptyLineTool :: Tool emptyLineTool = LineTool Nothing -- 已激活的直线工具(已选起点(1,1)) activeLineTool :: Tool activeLineTool = LineTool (Just (1, 1))
PolygonTool构造函数
接受一个[Point]列表,用来存储已经选择的多边形顶点,空列表表示还没选任何点:
-- 未激活的多边形工具(无顶点) emptyPolyTool :: Tool emptyPolyTool = PolygonTool [] -- 已选两个顶点的多边形工具 activePolyTool :: Tool activePolyTool = PolygonTool [(0, 0), (3, 0)]
补充:完善toolKeyMap
你代码里的toolKeyMap看起来没写完,完整的可以这样写,给每个工具初始状态:
toolKeyMap :: [(String, Tool)] toolKeyMap = [ ("R", RectangleTool Nothing), ("E", EllipseTool Nothing), ("L", LineTool Nothing), ("P", PolygonTool []) ]
内容的提问来源于stack exchange,提问作者toothbrush21
相关产品推荐
相关产品推荐

