如何在Haskell中转换(Num a)=> a到Float?

Kwa*_*Seo 2 haskell

是否可以将以下两个函数组合成Haskell中的一个多态函数?

mutiplyByTwoI :: Int -> Float
mutiplyByTwoI x = fromIntegral x * 2.0

mutiplyByTwoF :: Float -> Float
mutiplyByTwoF x = x * 2.0
Run Code Online (Sandbox Code Playgroud)

我试过Num a,但我找不到转换Num a为Float的方法.

mutiplyByTwo :: (Num a) => a -> Float
mutiplyByTwo = undefined
Run Code Online (Sandbox Code Playgroud)

Ben*_*son 9

并非每个实例Num都有明智的转换Float.对于一个简单的(哈哈)示例,考虑复数:

-- represented in rectangular coordinates
data Complex = Complex { real :: Float, imaginary :: Float } deriving (Eq, Ord, Show, Read)

instance Num Complex where
    Complex u v + Complex x y = Complex (u + x) (v + y)
    Complex u v * Complex x y = Complex (u * x - v * y) (v * x + u * y)
    negate (Complex u v) = Complex (negate u) (negate v)
    -- etc
Run Code Online (Sandbox Code Playgroud)

很明显,没有办法将a转换Complex为a Float而不丢弃信息:Floats生活在真实线的(子集)上,而复数则生活在复杂的平面上.没有toFloat :: Num a => a -> Float适用于所有实例的函数Num.

  • @nm [docs](http://hackage.haskell.org/package/base-4.9.0.0/docs/Prelude.html#v:signum)说没有比_的更多限制`函数`abs`和`signum`应该满足法则`abs x*signum x == x`_.对于复数,这个定律是合理的实现:`abs(A e ^iφ)= A`和`signum(A e ^iφ)= e ^iφ`.我从我的答案中省略了它,因为我无法将三角形从矩形转换为极性. (6认同)
  • @nm好,`Num`不是很好的类型类。充其量是不好的名字。 (2认同)