假设我想要实现费米函数(逻辑曲线的最简单的例子),使得如果传入一个Float
,它将返回一个Float
,如果传入一个Double
,它将返回一个Double
。以下是我的代码:
e = 2.7182845904523536
fermiFunc :: (Floating a) => a -> a
fermiFunc x = let one = fromIntegral 1 in one/(one + e^(-x))
问题在于 ghc 说 e
是一个 Double
类型。定义变量 one
也有点复杂。我想到的另一个解决方案是仅为双精度数定义该函数:
e = 2.7182845904523536
fermiFuncDouble :: Double -> Double
fermiFuncDouble x = 1.0/(1.0 + e^(-x))
然后使用
Either
:fermiFunc :: (Floating a) => Either Float Double -> a
fermiFunc Right x = double2Float (fermiFuncDouble (float2Double x))
fermiFunc Left x = fermiFuncDouble x
然而,这并不是很令人兴奋,因为我可能会写一个单独的函数来处理Float
类型的数据并调用fermiFuncDouble
函数。有没有一种好的方式来编写适用于两种类型的函数呢?
e
一个多态类型签名,就像你为fermiFunc
做的那样。根本不需要定义one
;只需使用1
即可。但是这里建议更彻底的更改的答案也很好。 - Daniel Wagner