2010-07-06 68 views
1

Possible Duplicate:
Return specific type within HaskellHaskell刚性类型?

此代码:

class Alpha a where 
    half :: Real f => a -> f 

instance Alpha Double where 
    half a = a/2.0 

产生这个错误:

rigid.hs:6:13: 
    Couldn't match expected type `f' against inferred type `Double' 
     `f' is a rigid type variable bound by 
      the type signature for `half' at rigid.hs:3:17 
    In the expression: a/2.0 
    In the definition of `half': half a = a/2.0 
    In the instance declaration for `Alpha Double' 
Failed, modules loaded: none. 

为什么?

编辑:搞清楚刚性类型的业务,我想我已经到了一个更集中的问题。如何将Double转换为满足Ord和Num的值?也就是说,一个函数可以让我(Ord a, Num a) => Double -> a

+0

你说得对。 DUP。 – qrest 2010-07-06 06:52:06

+0

'(fromRational。toRational)::(小数a,实数b)=> a - > b'? – ony 2010-07-06 09:08:22

+0

ony:你的类型是向后的; (fromRational。toRational)::(Real a,Fractional b)=> a - > b'。这也被称为'realToFrac'。 – BMeph 2010-07-06 20:56:04

回答

2

您声称half可以将类型a转换为任何Real类型。但您的half只能将aDouble)转换为Double

+0

我该怎么做:'(Ord a,Num a)=> Double - > a'? – qrest 2010-07-06 07:01:18

2

That is, a function that gets me (Ord a, Num a) => Double -> a?

问题是,你想从中得到什么样的语义?语义并不总是由类型决定的,即使在Haskell中也是如此。

这样的功能(即使没有Ord a约束)的一个例子是:

doubleToNum = fromInteger . round 

它满足所需的类型,但例如如果您将其应用于Double,它不会给您身份。

+0

我想我想要身份。也许我在想所有的类型都是错的? – qrest 2010-07-06 07:38:55

1

你将不能够找到很多有趣的功能,可以 转换成Double任何Ord例如Num。你可以用 创建一些满足这两个约束条件的漂亮类型。

不知道别的什么,你可以凭空编造出值 的唯一方法是使用fromInteger。据我所知,Ord实例不是 可以帮助您。

所以,你可以这样做:

f :: (Ord a, Num a) => Double -> a 
f = fromInteger . floor 

甚至更​​多平凡,f = const 0。 :)但是你没有太多的 可以用你的Double s的小数部分来做,因为 不能保证你的目标类型有任何小数部分大约是 它。

也许您在寻找Fractional a => Double -> a? 然后你可以使用realToFrac

+0

也许你想要做的是当目标类型不是小数时截断(或舍入),但如果目标类型支持小数部分则保留小数部分。如果是这样,那么你需要使用诸如“多参数类型类”或“关联类型”这样的扩展名来使目标类型成为类中变化的一部分。或者分别对待这两种情况,每种情况都有自己的类。 – Yitz 2010-07-06 08:43:55

1

停止!

深呼吸,写出你真正想要的是什么。

我会停止尝试猜测你会喜欢的东西,并要求另一个修改语句。我认为realToFrac可能会做你想要的,但我不确定。

您是否在寻找一个函数,它需要一个Double,并以某种方式“发明”一个新类型,它是Ord和Num的成员,但没有更多指定的行为?你是否想要一种方式来使用一个你已经想到的其他类型的Double?

就像一个小型的“思想实验”一样,想象一下计算机试图在Bool上使用你的函数 - 你能否用这种方式来说明问题,使它在Bool上有意义,或者显然无法使用布尔?

对不起,我无法回答你问的问题,但希望我已经帮助你以某种方式得到更好的答案。