2

要声明常量变量,我可以在 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::GIANTS比 清楚得多GIANTS

根据下面的评论,似乎我可以完成它的唯一方法是执行以下操作:

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

fromEnum' x = (fromEnum x) + 10

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

4

2 回答 2

17

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

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

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

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

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

-- SomeOtherModule.hs
module SomeOtherModule where
import qualified Colours

foo = Colours.Red

也就是说,为这种类型创建带有常量的模块(或导入它们)并不是真正必要的,因为您可以轻松地通过它们的类型来跟踪事物。

于 2013-02-10T15:59:16.680 回答
7

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

red = 10
blue = 20
green = 30

将是等效的。

一个更有趣的问题是你为什么要这样做?在 Haskell 中可能有更好的方法来完成你想要的。@CatPlusPlus 的回答显示了这样做的好方法。

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

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

于 2013-02-10T15:31:56.040 回答