我试图定义一个函数来返回第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”
匹配
有没有办法可以强制参数为整数而不强制复数具有整数分量?
答案 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)]