要声明常量变量,我可以在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
BASEBALL_TEAM::GIANTS
比GIANTS
清晰得多。
基于下面的评论,似乎我能够完成它的唯一方法是做类似下面的事情:
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
,语法不是很干净。
答案 0 :(得分:17)
未标记的常量很糟糕。如果你使用一堆Int
常量,那么你将失去类型检查(考虑Int -> whatever
函数可能采用的值而不是SomeConstType -> whatever
)并可能引入错误。你想要一个强类型:
data Colour = Red | Blue | Green deriving (Show, Eq, Enum)
此外,在大多数情况下,将这些值表示为整数并不是必需的。如果确实需要它,Enum
类型类提供toEnum
和fromEnum
。
对于名称空间:模块是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,目前处于测试阶段,但我自己没有尝试过。这是一个更具交互性的设置,您可以在浏览器中直接尝试。