Haskell中的常量变量声明

时间:2013-02-10 15:25:16

标签: haskell

要声明常量变量,我可以在Ruby中执行以下操作

class COLOR
   RED   = 10
   BLUE  = 20
   GREEM = 30
end

COLOR::RED返回10COLOR::BLUE返回20,依此类推。我如何在Haskell中实现这一目标?

我希望在变量名前面有一个命名空间名称。也许上面的例子不是一个好例子。对于下面的情况,您可以看到包含命名空间名称将使变量更容易理解。

class BASEBALL_TEAM
   GIANTS = 15
   METS = 30
   REDS = 45
   ...
end

BASEBALL_TEAM::GIANTSGIANTS清晰得多。

基于下面的评论,似乎我能够完成它的唯一方法是做类似下面的事情:

module Color (Color) where
data Color = Red | Blue | Green deriving (Eq, Show, Ord, Bounded, Enum)                        

fromEnum' x = (fromEnum x) + 10

10获取Color.Red的整数值,我必须写fromEnum Color.Red,语法不是很干净。

2 个答案:

答案 0 :(得分:17)

未标记的常量很糟糕。如果你使用一堆Int常量,那么你将失去类型检查(考虑Int -> whatever函数可能采用的值而不是SomeConstType -> whatever)并可能引入错误。你想要一个强类型:

data Colour = Red | Blue | Green deriving (Show, Eq, Enum)

此外,在大多数情况下,将这些值表示为整数并不是必需的。如果确实需要它,Enum类型类提供toEnumfromEnum

对于名称空间:模块是Haskell中的名称空间。将您的类型放入模块中,然后您可以将其导入为合格,并且您将拥有前缀:

-- Colours.hs
module Colours (Colour) where
data Colour = ...

-- SomeOtherModule.hs
module SomeOtherModule where
import qualified Colours

foo = Colours.Red

也就是说,为这一个类型创建带有常量的模块(或者导入它们是合格的)并不是必需的,因为你可以根据类型轻松地跟踪事物。

答案 1 :(得分:7)

默认情况下,Haskell中的事情是不变的,所以

red = 10
blue = 20
green = 30

等同。

一个更有趣的问题是你想要这样做的原因?有可能更好的方法来实现你在Haskell中想要的东西。 @CatPlusPlus的答案显示了这样做的好方法。

这似乎是一个非常基本的Haskell问题,所以我会礼貌地指向Learn you a Haskell,在我看来,这是开始使用Haskell的最佳资源。

学习Haskell的另一个有前途的资源是FP complete School of Haskell,目前处于测试阶段,但我自己没有尝试过。这是一个更具交互性的设置,您可以在浏览器中直接尝试。