我试着写在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的人名的列表,形成"健康"中的布尔函数.
请帮忙 !!!!
首先,我认为你可能意味着定义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,你可以在没有助手的情况下一次性表达整个功能.