我如何使我的函数返回双精度而不更改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

sqrtnot返回一个Float,它返回与该参数相同类型的值,并且它是Floating的实例(请注意,Floating是一个类型类,和notFloat(是一种类型)相同)。因此,它的类型为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类型?的主要内容,如果未能解决你的问题,请参考以下文章

更改 SWIG 包装函数返回值

“查询结构与函数结果类型不匹配。返回类型双精度与第 1 列中的预期类型整数不匹配。”?

在 C# 中使用非托管 C++ 代码对所有双精度类型返回 0

如何舍入双精度值但保持尾随零

如何从函数返回(bigint,双精度)数组以将其转换为json数组

如何安全地赋予我的功能而不使我的主要形式卡住