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 -> whateverSomeConstType -> 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

とは言うものの、定数を使用してこの1つのタイプ専用のモジュールを作成する(または修飾されたモジュールをインポートする)必要はありません。タイプごとに簡単にトレースできるからです。

于 2013-02-10T15:59:16.680 に答える
7

Haskell ではデフォルトで定数なので、

red = 10
blue = 20
green = 30

同等になります。

もっと興味深い質問は、なぜこれをやりたいのかということです。Haskell で目的を達成するためのより良い方法がある可能性があります。@CatPlusPlus による回答は、これを行う良い方法を示しています。

これは非常に基本的な Haskell の質問のように思えるので、Haskellを始めるのに最適なリソースであるLearn you a Haskellを丁寧に紹介します。

Haskell を学習するためのもう 1 つの有望なリソースは、FP complete のSchool of Haskellです。これは現在ベータ版ですが、自分で試したことはありません。これはよりインタラクティブな設定で、ブラウザーで直接試すことができます。

于 2013-02-10T15:31:56.040 に答える