不能使函数更具多态性

时间:2017-02-17 13:25:06

标签: haskell types

我试图定义一个函数来返回第n roots of unity个。{ 这个编译,

unity n = map (cis.(*2).(*pi).(/n)) [0..(n-1)]

但其类型默认为unity :: (Enum a, Floating a) => a -> [Complex a] 当然,n需要是一个整数,因为统一的根不是另外定义的;但返回的复数必须有浮点坐标;即,他们不能Complex Int。但是,以下代码不会编译

unity :: (Integral a, Floating b) => a -> [Complex b]
unity n = map (cis . (* 2) . (* pi) . (/ n)) [0..(n - 1)]

因为(/) (*)cis各自约束返回类型(或cis的情况下的复杂坐标类型)与参数类型相同;所以我得到了错误

  

无法将预期类型“b”与实际类型“a”

匹配

有没有办法可以强制参数为整数而不强制复数具有整数分量?

1 个答案:

答案 0 :(得分:4)

当您的代码需要与返回类型相同类型的值时,您需要做的就是将Integral参数强制转换为Num fromIntegral,即作为{cis的参数{1}},(*)(/)。虽然n只是直接传递到(/),但您需要担心的是:

unity :: (Integral a, Floating b) => a -> [Complex b]
unity n = map (cis . (* 2) . (* pi) . (/ (fromIntegral n)) . fromIntegral) [0..(n-1)]