Haskell中的常量变量声明

Haskell中的常量变量声明,haskell,Haskell,要声明常量变量,我可以在Ruby中执行以下操作 class COLOR RED = 10 BLUE = 20 GREEM = 30 end COLOR::RED返回10,COLOR::BLUE返回20,依此类推。我如何在Haskell做到这一点 我希望在变量名前面有一个名称空间名称。也许上面的例子不是一个好例子。对于下面的例子,您可以看到包含名称空间名称将使变量更容易理解 class BASEBALL_TEAM GIANTS = 15 METS = 30

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

class COLOR
   RED   = 10
   BLUE  = 20
   GREEM = 30
end
COLOR::RED
返回
10
COLOR::BLUE
返回
20
,依此类推。我如何在Haskell做到这一点

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

class BASEBALL_TEAM
   GIANTS = 15
   METS = 30
   REDS = 45
   ...
end
棒球队:巨人队比巨人队清楚得多

根据下面的评论,似乎我能做到这一点的唯一方法是做以下事情:

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

fromEnum' x = (fromEnum x) + 10

要为
Color.Red
获取
10
的整数值,我必须从enum Color.Red编写
,语法不是很清晰

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

red = 10
blue = 20
green = 30
就相当于

一个更有趣的问题是为什么要这样做?在Haskell中,可能有更好的方法来实现您的目标。@CatPlusPlus的答案显示了一种很好的方法

这似乎是一个非常基本的Haskell问题,所以我将礼貌地向您指出,在我看来,这是开始Haskell的最佳资源


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

未标记的常量不好。如果使用大量的
Int
常量,则会丢失类型检查(想想
Int->which
函数所取的可能值,而不是
SomeConstType->which
),并可能引入错误。您需要的是强类型:

data Colour = Red | Blue | Green deriving (Show, Eq, Enum)
而且,在大多数情况下,将这些值表示为整数并不是真正必要的。如果您确实需要它,
Enum
typeclass提供了
toEnum
fromnum

至于名称空间:模块是Haskell中的名称空间。将您的类型放入一个模块中,然后您可以将其导入到限定的模块中,您将拥有前缀:

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

-- SomeOtherModule.hs
module SomeOtherModule where
import qualified Colours

foo = Colours.Red

也就是说,仅为这一类型创建带有常量的模块(或导入符合条件的模块)并不是真正必要的,因为您可以轻松地按其类型进行跟踪。

…对于已编辑的问题,其中询问了名称空间,模块是Haskell(唯一)的名称空间机制。谢谢,这很有帮助。然而,为了将一个整数映射到一个特定的常量,我总是做一些类似于fromnum的Color.Red的事情,语法不是很清晰。@user342673
toEnum int::Color
,但是首先应该避免使用整数。您当然不需要在代码中使用它们,它主要用于序列化互操作的值或其他内容。