我挣扎了好几个小时才得到以下正确的东西:
to_xyz_regular :: (RealFrac t) => (RegularSpd t) -> (t, t, t)
to_xyz_regular spd@(RegularSpd lambda_min lambda_max spectrum delta inverse_delta) =
let
l = length cie_x - 1
il = 1.0 / fromIntegral l
samp i = sample spd $ lambda_min + inverse_delta * fromIntegral i
integrate curve = (foldr (+) 0 $
map (\i -> curve!!i * samp i) [0..l]) * il
in (integrate cie_x, integrate cie_y, integrate cie_z)
(这是从颜色 SPD/光谱到 XYZ 颜色的转换例程)。
这些值cie_XXX
定义如下:
cie_start = 360.0
cie_end = 830.0
cie_x = [0.0001299000, 0.0001458470, 0.0001638021, 0.0001840037,
....]
cie_y = ....
cie_z = ....
但后来粗略地给了我
Could not deduce (t ~ Double)
from the context (RealFrac t)
....
问题是cie_XXX
存储为的值Double
,我真的希望它们是多态的。
我最终找到的解决方案是为这些值添加类型签名:
cie_start :: (RealFrac t) => t
cie_end :: (RealFrac t) => t
cie_x :: (RealFrac t) => [t]
cie_y :: (RealFrac t) => [t]
cie_z :: (RealFrac t) => [t]
现在我的问题是:这是在 Haskell 中拥有多态值/文字的正确方法吗?
在网络搜索上找到解决方案对我来说有点困难,因为书籍、教程等仅提到参数函数的类型签名 -> 值只是无参数函数吗?