我是Haskell的新手,我得到了一个返回有效三角形区域的任务。但是,无论何时运行我的代码,它都会打印Just <float>
。即Just 0.631
。这是我的代码:
triangleArea :: Float -> Float -> Float -> Maybe Float
triangleArea a b c
| a+b>=c && b+c>=a && a+c>=b = Just (sqrt(s*(s-a)*(s-b)*(s-c)))
| otherwise = error "Not a triangle!"
where
s=(a+b+c)/2
答案 0 :(得分:8)
并非所有的边长都将对应于一个真实的三角形。您有两种选择:
定义一个 partial 函数,该函数返回一个Float
,并调用error
表示无效的一组长度。不过,这不是在Haskell中推荐的方法。
triangleArea :: Float -> Float -> Float -> Float
triangleArea a b c | a + b >= c && a + c >= b && a + c >= b = area
| otherwise = error "Not a triangle!"
where s = (a + b + c) / 2
area = sqrt $ s*(s-a)*(s-b)*(s-c)
推荐:使用Maybe Float
作为返回类型,并在参数未定义三角形时返回Nothing
。
triangleArea :: Float -> Float -> Float -> Maybe Float
triangleArea a b c | a + b >= c && a + c >= b && a + c >= b = Just area
| otherwise = Nothing
where s = (a + b + c) / 2
area = sqrt $ s*(s-a)*(s-b)*(s-c)
这会迫使任何调用triangleArea
的人处理未定义三角形的可能性,而不是仅仅使程序崩溃。
(为完整性起见,还有其他选择,即Either SomeType Float
,但它们是#2的概括,在这里您可以提供比Nothing
更为具体的“错误”值。)
答案 1 :(得分:3)
triangleArea :: Float -> Float -> Float -> Maybe Float
此行声明triangleArea
将是一个接受3个Float
数字并返回Maybe Float
的函数。 Maybe
只是Haskell中的一种类型,可以是Nothing
,表示不存在值,或者Just x
表示存在值,并且是{{1} }。
这就是为什么在您的职能中拥有
x
重要的是(condition) = Just (sqrt(s*(s-a)*(s-b)*(s-c)))
是 会出现的值。
(condition)
部分有点陌生–您可能根本不希望它抛出otherwise
。相反,您可以通过使用error
作为结果来指示给定参数没有值(区域):
Nothing
或者,可以将函数声明为简单地返回triangleArea :: Float -> Float -> Float -> Maybe Float
triangleArea a b c
| a + b >= c && b + c >= a && a + c >= b = Just (sqrt (s * (s - a) * (s - b) * (s - c)))
| otherwise = Nothing
where
s=(a+b+c)/2
,并在给定无效参数时引发错误。确保仔细阅读任务要求您执行的操作,是否可以更改签名,如果可以,请记录功能的作用(课程作业/入门作业中的典型要求)。