身体质量指数计划在Haskell

use*_*996 1 haskell

我试着写在Haskell一个简单的程序,它可以决定一个人的身体质量指数.

这是我写的:

type Height = Float
type Weight = Float
type PeopleStats = [(String, Height, Weight)]
Run Code Online (Sandbox Code Playgroud)

和...

bmi :: Height -> Weight -> Float
bmi heightCm weightKg = weightKg/(heightCm)^2

healthy :: Height -> Weight -> Bool
healthy heightCm weightKg | 25 > index && 18 < index = True
                          | otherwise                = False
  where index = bmi heightCm weightKg
Run Code Online (Sandbox Code Playgroud)

到目前为止,"健康"功能可以计算某人的BMI,并且功能"healthyPeople"返回一个布尔语句,确定该人的BMI是否落入健康人认为正常的限度内.

我想写一个名为"healthyPeople"的函数.

healthyPeople :: PeopleStats -> [String]
Run Code Online (Sandbox Code Playgroud)

此函数需要获取PeopleStats列表并返回"健康"功能中被视为"健康"的人的名称(字符串)列表.

例如:

如果我输入,[("Lee", 65, 185), ("Wang", 170, 100), ("Tsu", 160, 120)]我将获得一个BMI返回true的人名的列表,形成"健康"中的布尔函数.

请帮忙 !!!!

tza*_*man 5

首先,我认为你可能意味着定义bmi为:

bmi :: Height -> Weight -> Float
bmi heightCm weightKg = weightKg/(heightCm/100)^2
Run Code Online (Sandbox Code Playgroud)

因为公式使用以米为单位的高度.

现在,这是使用辅助函数逐步完成它的方法.我定义了一个类型:

type PersonStats = (String, Height, Weight)
Run Code Online (Sandbox Code Playgroud)

以及该类型的一些功能:

healthyPerson :: PersonStats -> Bool
healthyPerson (name, h, w) = healthy h w

getName :: PersonStats -> String
getName (name, h, w) = name
Run Code Online (Sandbox Code Playgroud)

有了这些,最终的功能变得微不足道:

healthyPeople :: PeopleStats -> [String]
healthyPeople people = map getName $ filter healthyPerson people
Run Code Online (Sandbox Code Playgroud)

或以无点符号表示:

healthyPeople :: PeopleStats -> [String]
healthyPeople = map getName . filter healthyPerson
Run Code Online (Sandbox Code Playgroud)

首先,您从列表中筛选出健康的人,然后将统计信息列表映射到名称列表中.
如果你使用lambdas,你可以在没有助手的情况下一次性表达整个功能.