首页 > 解决方案 > 如何在不更改度量类型的情况下使我的函数返回双精度值?

问题描述

我有一个函数“距离”,可以计算两点之间的距离。我的问题是该函数应该是 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 中将 float 转换为 double 但没有发现任何有用的

标签: haskelltype-conversionsqrt

解决方案


我的问题是函数应该是 type Metric,一个返回 a Doublewhile mysqrt在函数内返回 a的类型Float

sqrt不返回 a ,Float返回一个与参数相同类型的值,并且那是一个实例Floating(注意这Floating是一个类型类,与不同Float它是一个类型)。因此它具有 as 类型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话虽这么说,让return an可能更有意义a

type Metric2 a = Point a -> Point a -> a

然后使用 a Floating a => Metric2 a

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

推荐阅读