我对Haskell来说是全新的,所以请记住这一点
我正在研究一个相当简单(或者我认为如此)的项目 - 一个弦乐器张力计算器。这是我到目前为止所得到的:
data Operator = Metric | Imperial
deriving Read
eval o l u p = case o of
Imperial -> (((2 * l * p)^2) * u) / 386.4
Metric -> (((2 * (l * 2.54) * p)^2) * u) / 386.4
prompt txt = do
putStrLn txt
readLn
main = do
o <- prompt "Metric or Imperial?"
l <- prompt "Scale length?"
u <- prompt "Gauge?" -- Unit Weight
p <- prompt "Pitch? (In hertz)"
putStrLn $ "The result is " ++ show (eval o l u p)
它允许您为刻度长度选择公制或英制,并根据长度,规格和所需的间距计算张力,以磅为单位输出。
我遇到的问题是:我希望计算器根据我输入的标尺数来获取单位重量。
我想改变&#34; u&#34;在
u <- prompt "Gauge?" -- Unit Weight
到&#34; g&#34;,如果&#34; g&#34;匹配一个从0.07到0.80的数字,它返回单位重量&#34; u&#34;例如,对应于表格中的量规,量表的单位重量为0.80将为0.00115011,我希望它反映在等式中。
我该怎么做?我需要做什么来创建&#34; g&#34;的表格/列表?价值观给予&#34;你&#34;&#39;
表格和方程式我使用的方式是:http://www.daddario.com/upload/tension_chart_13934.pdf
答案 0 :(得分:0)
我会给你一个基本解决方案的提示。
将地图定义为对(gauge, unitWeight)
对的列表。根据{{1}}订购。
gauge
然后,假设您有一个gw :: [(Double, Double)]
gw = [(1, 2), (2, 4), ... ]
来查找。您想要从g
丢弃所有带有标尺gw
的初始对。为此,您可以使用
<g
然后,您可以获取剩余列表中的第一对元素,并提取单位权重。
由于您每次都扫描几乎整个列表,这取决于您的仪表,因此效率不是很高。可以使用dropWhile (some predicate here) gw
来改善这一点。然而,对于初学者练习,使用列表应该这样做。无论如何,你可能不会有大量的列表项,所以程序应该仍然非常快。