要声明常量变量,我可以在Ruby中执行以下操作
class COLOR
RED = 10
BLUE = 20
GREEM = 30
end
Run Code Online (Sandbox Code Playgroud)
COLOR::RED返回10,COLOR::BLUE返回20等.我如何在Haskell中实现这一目标?
我想在我的变量名前面有一个命名空间名称.也许上面的例子不是一个好例子.对于下面的情况,您可以看到包含命名空间名称将使变量更容易理解.
class BASEBALL_TEAM
GIANTS = 15
METS = 30
REDS = 45
...
end
Run Code Online (Sandbox Code Playgroud)
BASEBALL_TEAM::GIANTS很清楚GIANTS.
基于下面的评论,似乎我能够完成它的唯一方法是做类似下面的事情:
module Color (Color) where
data Color = Red | Blue | Green deriving (Eq, Show, Ord, Bounded, Enum)
fromEnum' x = (fromEnum x) + 10
Run Code Online (Sandbox Code Playgroud)
得到10for的整数值Color.Red,我要写fromEnum Color.Red,语法不是很干净.
Cat*_*lus 17
未标记的常量很糟糕.如果你使用一堆Int常量,那么你将失去类型检查(考虑Int -> whatever函数所采用的可能值而不是SomeConstType -> whatever)并可能引入错误.你想要一个强类型:
data Colour = Red | Blue | Green deriving (Show, Eq, Enum)
Run Code Online (Sandbox Code Playgroud)
此外,在大多数情况下,将这些值表示为整数并不是必需的.如果你真的需要它,Enum类型类提供toEnum和fromEnum.
至于名称空间:模块是Haskell中的名称空间.把你的类型放在一个模块中然后你可以导入它合格,你将有你的前缀:
-- Colours.hs
module Colours (Colour) where
data Colour = ...
-- SomeOtherModule.hs
module SomeOtherModule where
import qualified Colours
foo = Colours.Red
Run Code Online (Sandbox Code Playgroud)
也就是说,为这一种类型创建具有常量的模块(或者导入它们是合格的)并不是必需的,因为您可以轻松地按类型跟踪事物.
默认情况下,事情在Haskell中是不变的,所以
red = 10
blue = 20
green = 30
Run Code Online (Sandbox Code Playgroud)
会是等同的.
一个更有趣的问题是你想要这样做的原因?有可能更好的方法来实现你在Haskell中想要的东西.@CatPlusPlus的答案显示了这样做的好方法.
这看起来像是一个非常基本的Haskell问题,所以我会礼貌地指出你学习一个Haskell,在我看来,这是开始使用Haskell的最佳资源.
学习Haskell的另一个有前途的资源是FP complete的Haskell学校,目前处于测试阶段,但我自己没有尝试过.这是一个更具交互性的设置,您可以在浏览器中直接尝试.