(\x=>2.0*x) `map` [1..10] "Can't find implementation for Enum Double"
(\x=>2.0*x) `map` [1..10] "Can't find implementation for Enum Double"
当我在 Idris 解释器中输入那个简单的表达式时,它导致了一个错误:
Idris> (\x=>2.0*x) `map` [1..10]
When checking an application of function Prelude.Functor.map:
Can't find implementation for Enum Double
到底是怎么回事?
我希望它能工作,因为 List Int
会被映射到 List Double
,因为地图的类型当然允许不保留原始类型。
\x => 2.0 * x
的类型是 Double -> Double
并且 [from .. to]
是 enumFromTo
的语法糖,具有以下类型 -- Enum a => a -> a -> List a
因此您的表达式期望建立双打列表,但不能,因为(可以预见)没有双打枚举。
一种可能的解决方案是显式强制转换,让 Idris 找出源和目标类型:
Idris> (\x=>2.0 * (cast x)) `map` [1..10]
[2.0, 4.0, 6.0, 8.0, 10.0, 12.0, 14.0, 16.0, 18.0, 20.0] : List Double
当我在 Idris 解释器中输入那个简单的表达式时,它导致了一个错误:
Idris> (\x=>2.0*x) `map` [1..10]
When checking an application of function Prelude.Functor.map:
Can't find implementation for Enum Double
到底是怎么回事?
我希望它能工作,因为 List Int
会被映射到 List Double
,因为地图的类型当然允许不保留原始类型。
\x => 2.0 * x
的类型是 Double -> Double
并且 [from .. to]
是 enumFromTo
的语法糖,具有以下类型 -- Enum a => a -> a -> List a
因此您的表达式期望建立双打列表,但不能,因为(可以预见)没有双打枚举。
一种可能的解决方案是显式强制转换,让 Idris 找出源和目标类型:
Idris> (\x=>2.0 * (cast x)) `map` [1..10]
[2.0, 4.0, 6.0, 8.0, 10.0, 12.0, 14.0, 16.0, 18.0, 20.0] : List Double