haskell - 如何在不更改度量类型的情况下使我的函数返回双精度值?
问题描述
我有一个函数“距离”,可以计算两点之间的距离。我的问题是该函数应该是 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 但没有发现任何有用的
解决方案
我的问题是函数应该是 type
Metric
,一个返回 aDouble
while 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
推荐阅读
- ios - 按钮并不像预期的那样完全一样 iOS Autolayout
- php - 如何回显结果错误而不是 var dump
- kubernetes - Deis 部署中持续存在的损坏参数
- python - 如何在枚举中使用 Flask-Babel?
- ubuntu - 带有 Chromium 的 Docker 内 RPi3 上的 ALSA 随机丢失音频
- c++ - C++ 编译器何时为方法推断 noexcept?
- sql - postgreSQL 1 分钟平均值
- python - 将全局变量分配给函数的局部变量
- r - R中的ifelse语句用法
- reactjs - 编译失败。react-router 3 中未定义“Greeting”