【问题标题】:How can I make my function return a double without changing type Metric?如何在不更改度量类型的情况下使我的函数返回双精度值?
【发布时间】:2019-11-07 12:41:45
【问题描述】:

我有一个函数“距离”,可以计算两点之间的距离。 我的问题是该函数应该是 Metric 类型,该类型返回一个 Double,而我在函数中的 sqrt 返回一个 Float。 这是我的代码:

    type Metric a = Point a -> Point a -> Double
    type Point a = (a, a)
    distance :: Floating a => Metric a
    distance (a1,b1) (a2, b2) = sqrt ((a*a)+(b*b))
       where a = a2 - a1
             b = b2 - b1

我知道如果将 Metric 写为 Point a -> Point a -> a 将解决我的问题,但我需要按原样使用 Metric 我还查找了如何在 Haskell 中将浮点数转换为双精度数,但没有发现任何帮助

【问题讨论】:

  • sqrt 不返回Float,它返回一个与参数类型相同的值,即Floating 的一个实例(注意Floating 是一个typeclass,并且Float相同,后者是一个类型)。您可以在这里将您的 distance 函数专门化为 distance :: Metric Double

标签: haskell type-conversion sqrt


【解决方案1】:

我的问题是函数应该是Metric类型,该类型返回Double,而我在函数中的sqrt返回Float

sqrt 确实返回Float,它返回一个与参数类型相同的值,即Floating 的一个实例(注意Floating是一个类型类,Float 相同,后者是一个类型)。因此它的类型为sqrt :: Floating a => a -> a

您可以在这里将您的distance 函数专门化为distance :: Metric Double

distance :: Metric Double
distance (a1,b1) (a2, b2) = sqrt ((a*a)+(b*b))
    where a = a2 - a1
          b = b2 - b1

话虽如此,让Metric 返回a 可能更有意义:

type Metric2 a = Point a -&gt; Point a -&gt; <b>a</b>

然后使用Floating a =&gt; Metric2 a:

distance :: Floating a => Metric2 a
distance (a1,b1) (a2, b2) = sqrt ((a*a)+(b*b))
    where a = a2 - a1
          b = b2 - b1

【讨论】:

  • 哦,我现在明白了,当我使用 Metric Double 时它起作用了,但是让 Metric 返回一个 a 更有意义。非常感谢!!
猜你喜欢
  • 2019-10-19
  • 2013-01-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多