在打印浮标时从“ Just 0.631”中删除“ Just”

时间:2019-10-03 19:05:11

标签: haskell

我是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

2 个答案:

答案 0 :(得分:8)

并非所有的边长都将对应于一个真实的三角形。您有两种选择:

  1. 定义一个 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)
    
  2. 推荐:使用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 ,并在给定无效参数时引发错误。确保仔细阅读任务要求您执行的操作,是否可以更改签名,如果可以,请记录功能的作用(课程作业/入门作业中的典型要求)。