我们如何在另一个函数中使用一个函数的结果(Haskell)?
在计算面积之前,我想测试一系列的3个输入是否可以一起形成一个三角形 为了看它们是否能形成三角形,我有:我们如何在另一个函数中使用一个函数的结果(Haskell)?,haskell,Haskell,在计算面积之前,我想测试一系列的3个输入是否可以一起形成一个三角形 为了看它们是否能形成三角形,我有: test :: Float -> Float -> Float -> Bool test a b c | a>0 && b>0 && c>0 && a+b>c && c+b>a &&c+a > b= True | otherwise = Fals
test :: Float -> Float -> Float -> Bool
test a b c
| a>0 && b>0 && c>0 && a+b>c && c+b>a &&c+a > b= True
| otherwise = False
要计算我拥有的面积:
sqrt(s(s-a)(s-b)(s-c))
where s= (a+b+c)/2
我想也许像这样的事情会奏效:
area_of_triangle :: Float -> Float -> Float -> Bool-> Maybe Float
area_of_triangle
| test== True = sqrt(s(s-a)(s-b)(s-c))
| True = Nothing
where s= (a+b+c)/2
但它返回错误:
Solution.hs:8:31: Not in scope: ‘a’
Solution.hs:8:36: Not in scope: ‘b’
Solution.hs:8:41: Not in scope: ‘c’
Solution.hs:10:19: Not in scope: ‘a’
Solution.hs:10:21: Not in scope: ‘b’
Solution.hs:10:23: Not in scope: ‘c’
首先,不需要为了返回
True
或False
而测试布尔值:只需返回布尔值即可
test :: Float -> Float -> Float -> Bool
test a b c = a>0 && b>0 && c>0 && a+b>c && c+b>a && c+a>b
然后,对于另一个函数:
我们必须添加参数abc
,以及乘法符号*
在第一种情况下,我们需要使用Just
将浮点
转换为可能浮点
test
需要它的三个参数
此外,检查boolean==True
也没有意义——只需使用boolean
最后,为什么要使用Bool
参数?我们不需要它,我们把它拿走
area_of_triangle :: Float -> Float -> Float -> Maybe Float
area_of_triangle a b c
| test a b c = Just (sqrt (s * (s-a) * (s-b) * (s-c)))
| otherwise = Nothing
where s = (a+b+c)/2
在Haskell中,函数名通常使用
camelCase
。考虑将您的函数重命名为<代码> AraOfField,遵循惯例。有很多错误。code>sqrt(s(s-a)(s-b)(s-c))是无效语法。三角形的区域类型错误area\u of_triangle
没有参数,但您尝试命名它们。将一个函数与一个布尔值进行比较。把你的代码分成小块,让它们单独工作。@SebastianRedl:严格来说,这不是无效的语法,它只需要一个完全虚假的s
@leftaroundabout Cans(s-a)
真的被输入了吗?@chi:类BogusS a,其中s::a
和实例BogusS Int
和实例BogusS(Int->Int)
就可以了。@leftaroundabout呃,对<代码>s::a;s=s
也可以工作。谢谢。我们还可以考虑将<代码>测试<代码>作为一个单独的函数,或者至少使它成为本地代码,以<代码> > AcaOffic < < />代码>。在这个特定的例子中,我只需输入条件。另一个要考虑的是生成一个三角形类型(<代码>数据三角形=三{a::浮标,b::浮标,c::浮标}/COD>),然后创建一个。