我如何使我的函数返回双精度而不更改Metric类型?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了我如何使我的函数返回双精度而不更改Metric类型?相关的知识,希望对你有一定的参考价值。
我有一个'距离'函数,用于计算两点之间的距离。我的问题是该函数应为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,但没有发现任何帮助
我的问题是该函数应该是
Metric
类型,该类型返回Double
,而我在函数中的sqrt
返回Float
。
sqrt
会not返回一个Float
,它返回与该参数相同类型的值,并且它是Floating
的实例(请注意,Floating
是一个类型类,和not与Float
(是一种类型)相同)。因此,它的类型为sqrt :: Floating a => a -> a
。
您可以在这里将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 -> Point a -> a
:
Floating a => Metric2 a
以上是关于我如何使我的函数返回双精度而不更改Metric类型?的主要内容,如果未能解决你的问题,请参考以下文章
“查询结构与函数结果类型不匹配。返回类型双精度与第 1 列中的预期类型整数不匹配。”?
在 C# 中使用非托管 C++ 代码对所有双精度类型返回 0