Haskell中的仪器弦张力计算器

时间:2017-04-13 22:33:50

标签: haskell

我对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

1 个答案:

答案 0 :(得分:0)

我会给你一个基本解决方案的提示。

将地图定义为对(gauge, unitWeight)对的列表。根据{{​​1}}订购。

gauge

然后,假设您有一个gw :: [(Double, Double)] gw = [(1, 2), (2, 4), ... ] 来查找。您想要从g丢弃所有带有标尺gw的初始对。为此,您可以使用

<g

然后,您可以获取剩余列表中的第一对元素,并提取单位权重。

由于您每次都扫描几乎整个列表,这取决于您的仪表,因此效率不是很高。可以使用dropWhile (some predicate here) gw 来改善这一点。然而,对于初学者练习,使用列表应该这样做。无论如何,你可能不会有大量的列表项,所以程序应该仍然非常快。