Haskell中的常量变量声明

use*_*673 2 haskell

要声明常量变量,我可以在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类型类提供toEnumfromEnum.

至于名称空间:模块是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)

也就是说,为这一种类型创建具有常量的模块(或者导入它们是合格的)并不是必需的,因为您可以轻松地按类型跟踪事物.

  • @ user342673`toEnum int :: Color`,但你应该首先避免使用整数.你当然不需要在你的代码中使用它们,它主要用于序列化互操作或其他任何值. (2认同)

Pau*_*aul 7

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

red = 10
blue = 20
green = 30
Run Code Online (Sandbox Code Playgroud)

会是等同的.

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

这看起来像是一个非常基本的Haskell问题,所以我会礼貌地指出你学习一个Haskell,在我看来,这是开始使用Haskell的最佳资源.

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