Haskell 哈斯克尔,不知道该怎么做

Haskell 哈斯克尔,不知道该怎么做,haskell,Haskell,在Haskell指南中,我们被要求根据以下条件计算树木的重量: 从0到3米,它的重量为300公斤/米 超过3米,重量为200公斤/米 这就是我试过的。这很接近,但无法完全解决: weightTree high = 900 + (high - 3) * 200 所以,几天后,我想出了一个更好的方法来解决这个问题。感谢所有回复我的人,在这里我将告诉你们我最终要做的事情(也许它可以帮助其他人): 我看到了分解是如何具有教育意义的,但我个人觉得守卫更为新手友好:weightreeh | h

在Haskell指南中,我们被要求根据以下条件计算树木的重量:

  • 从0到3米,它的重量为300公斤/米
  • 超过3米,重量为200公斤/米
这就是我试过的。这很接近,但无法完全解决:

weightTree high = 900 + (high - 3) * 200

所以,几天后,我想出了一个更好的方法来解决这个问题。感谢所有回复我的人,在这里我将告诉你们我最终要做的事情(也许它可以帮助其他人):


我看到了分解是如何具有教育意义的,但我个人觉得守卫更为新手友好:
weightreeh | h<0=0;嗯,在必要之前,我从来都不喜欢跳到案例分析上来。案例分析在这里非常可读,特别是因为它准确地反映了问题描述。我不同意;问题描述没有直接说明一棵高于3米的树的重量等于300*3+200*(h-3)。你事先做了一些数学推导,而不是把问题写下来。你假设这棵树至少有3米高。如果
high
小于3该怎么办?在请求调试帮助时,您应该解释您做了什么,希望得到什么结果,以及得到了什么结果。如果你知道为什么没有得到正确的结果,你应该解释一下。如果您试图修复错误,您应该解释它们是什么以及它们出了什么问题。
import Control.Monad (sequence_)

weightTree :: (Num a, Ord a) => a -> a
weightTree height = lowerWeight + upperWeight
  where lowerWeight = 300 * lowerHeight
        upperWeight = 200 * upperHeight
        lowerHeight = (max 0 . min 3) height
        upperHeight = max 0 (height - 3)                

main :: IO ()
main = sequence_ $ test <$> [-1..5]
  where test h = putStrLn $ concat [ "Height "
                                   , show h
                                   , ", weight "
                                   , show (weightTree h)
                                   ]
Height -1, weight 0
Height 0, weight 0
Height 1, weight 300
Height 2, weight 600
Height 3, weight 900
Height 4, weight 1100
Height 5, weight 1300
weightTree height = (min height 3) * 300 + ((max height 3) - 3) * 200