Haskell三角形类型函数实现求助:编程新手遇报错问题
Haskell Triangle类型函数实现常见问题排查与解决
首先贴出你给出的Triangle类型定义:
data Triangle = Triangle { tP1 :: Point, tP2 :: Point, tP3 :: Point} deriving (Show)
下面是新手实现相关函数时容易踩的坑和解决方法:
先确认Point类型的定义
Triangle依赖Point类型,如果你的代码里没定义Point,或者定义不符合预期,会直接触发编译错误。比如最基础的Point定义应该是:data Point = Point { x :: Double, y :: Double } deriving (Show)要是用了Int类型但实际需要浮点运算,或者字段名写错,都会导致后续函数报错。
字段访问要注意大小写和拼写
Haskell对大小写敏感,tP1、tP2、tP3是Triangle的字段访问器,别写成小写的tp1。比如要获取三角形的第一个顶点,直接用tP1 yourTriangle即可。如果Point有x/y字段,取第一个点的x坐标就是x (tP1 yourTriangle)。函数类型签名必须匹配
写函数时先明确类型签名,避免类型不匹配的错误。比如实现计算三角形面积的函数,正确的类型签名是area :: Triangle -> Double,下面是基于海伦公式的完整实现:-- 先补全Point和辅助函数 data Point = Point { x :: Double, y :: Double } deriving (Show) distance :: Point -> Point -> Double distance p1 p2 = sqrt ((x p1 - x p2)^2 + (y p1 - y p2)^2) area :: Triangle -> Double area tri = let a = distance (tP1 tri) (tP2 tri) b = distance (tP2 tri) (tP3 tri) c = distance (tP3 tri) (tP1 tri) s = (a + b + c) / 2 in sqrt (s * (s - a) * (s - b) * (s - c))模式匹配的正确写法
如果不用字段访问器,想用模式匹配解构Triangle,注意语法格式:printTriangle :: Triangle -> String printTriangle (Triangle p1 p2 p3) = "三个顶点:" ++ show p1 ++ ", " ++ show p2 ++ ", " ++ show p3构造器
Triangle必须首字母大写,解构时的变量名可以自定义,但要和构造器的参数数量一致。常见报错的对应处理
Not in scope: data constructor 'Point':补上Point类型的定义。Couldn't match expected type 'Triangle' with actual type 'Point':函数参数传错了,把Point传给了需要Triangle的函数。Ambiguous occurrence 'x':Point的x字段和其他变量重名,要么修改变量名,要么用Point.x p1的方式限定访问。
如果有具体的报错信息或者你尝试的代码片段,可以贴出来,这样能更精准地帮你定位问题。
内容的提问来源于stack exchange,提问作者user20541711
相关产品推荐
相关产品推荐

