【发布时间】:2014-07-21 11:06:39
【问题描述】:
在 Haskell 中编写 FFI 代码时,我经常将 Int 和 CInt 变量混合在一起。我尝试定义一个新类型Intlike 来帮助定义可以表示为任一类型值的常量,如下所示:
type Intlike = forall a . (Num a, Integral a) => a
floatSize :: Intlike = fromIntegral $ sizeOf (1 :: CFloat)
然后GHCi这样抱怨:
Fractal.hs:276:24-35: No instance for (Num Intlike) arising from \
a use of ‘fromIntegral’ …
In the expression: fromIntegral
In the expression: fromIntegral $ sizeOf (1 :: CFloat)
In a pattern binding:
floatSize :: Intlike = fromIntegral $ sizeOf (1 :: CFloat)
Compilation failed.
(这是Rank2Types 语言扩展。)
但是,以下方法有效:
floatSize :: (Num a, Integral a) => a
floatSize = fromIntegral $ sizeOf (1 :: CFloat)
有没有让我一直写fromIntegral 的好解决方案? Intlike 和有效的有什么区别?它们看起来很相似。
【问题讨论】:
标签: haskell