【发布时间】:2015-07-26 09:11:39
【问题描述】:
翻阅“自学...”一书时,我遇到了一个 BMI 计算器应用程序。到目前为止,该应用程序需要一个 Double 对列表并返回一个 Double 列表:
calcBMI :: [(Double, Double)] -> [Dobule]
calcBMI xs = [bmi w h | (w, h) <- xs]
where bmi weight height = weight / height ^ 2
尝试对返回列表的每个元素应用另一个函数我尝试了map declareBMI head calcBMI [(w, h) | w <- [60..70], h <- [1.65]],但出现错误(其中定义了declareBMI):
declareBMI :: Double -> String
declareBMI bmi
| bmi <= 18.5 = "Skinny"
| bmi <= 25 = "Norm"
| bmi <=30 = "Overweight"
| otherwise = "OBESE!"
查看map(即map f x:xs = f x : map f xs)的定义后,我发现了问题:我试图在lazy列表的其余部分调用head,意思是解释器尝试首先运行calcBMI,然后才运行head-ing 结果...这当然会失败,因为calcBMI 需要一个配对列表。
所以,我的问题是
- 有没有办法强制对
calcBMI函数进行热切评估,以便我可以在结果列表上运行head? - 有没有更好的方法然后强制热切评估以允许我
head结果列表的每个元素?
【问题讨论】:
-
map head calcBMI [(w, h) | w <- [60..70], h <- [1.65]]只是类型错误,所以懒惰在这里并不是特别重要。此外,由calcBMI生成的列表具有[Double]类型,因此不可能head每个元素,因为head适用于列表而Double-s 不是列表。您能否说明您想要实现的功能? -
嗨。我想得到的结果是我运行另一个函数,比如
declareBMI,它采用数值calcBMI计算并输出一个字符串,上面写着“你没事”、“你很胖”等。据我所知calcBMI,正如我定义的那样,它返回一个 Double 列表:[Double]。我知道为什么map head不起作用...现在我想了想,但我也尝试过:map declareBMI head calcBMI...,它也失败了。 -
重新思考我的代码我明白为什么
map是不是正确的方法,从第二个元素开始,head没有任何内容,它的输入错误为安德拉斯·科瓦奇说!所以,我现在完全不知道如何从双打列表中生成声明列表。
标签: haskell recursion lazy-evaluation