2017-06-07 3 views

答えて

5

答えははいですが、警告があります。 funcの種類は何ですか?最初の引数は型であり、値ではないようです。後で...


Enumの導出の詳細は、あなたが連続のコンストラクタをオフに一覧表示する機能を取得し、Boundedを導出することは、あなたに「最初に」とこの列挙の「最後」の要素を取得する機能を取得します取得します。

data Class = Class1 
      | Class2 
      | Class3 
      deriving (Show, Eq, Enum, Bounded) 

その後、我々はenumFromTo minBound maxBound(または単に[minBound .. maxBound])を介してすべての要素のリストを取得することができます。

ただし、funcの最初の質問に戻ってください。引数として型を渡す必要があります。これを行う通常の方法は、ProxyScopedTypeVariablesを使用しています。

{-# LANGUAGE ScopedTypeVariables #-} 

import Data.Proxy (Proxy(..)) 

func :: forall a. (Enum a, Bounded a, Show a) => Proxy a -> [String] 
func Proxy = map show $ enumFromTo minBound (maxBound :: a) 

GHCiのでこれを試してみてください:の

ghci> func (Proxy :: Proxy Class) 
["Class1","Class2","Class3"] 
ghci> func (Proxy :: Proxy Bool) 
["True","False"] 
+0

あなたの答えはより教育的であり、おそらくより完全なものですが、より簡単に自分のニーズを満たすためにのみ、私は他を受け入れます。あなたの返信をありがとう! – FutureShocked

+0

私は他の答えが質問に設定された条件を満たすとは思わない。すでに "Class1"を使用できるのであれば、他のものも使用してみてはいかがですか? – karakfa

+0

@karakfaあなたのコメントは多分他の答えを意図していましたか?私はそれがここにどのように適用されるかはわかりません... – Alec

3

data Class = Class1 
      | Class2 
      | Class3 
      deriving (Show, Eq) 

私はこれらのように、それぞれの文字列バージョンを含む文字列のリストを構築するための簡単な方法はあります

data Class = Class1 | Class2 | Class3 deriving (Show, Eq, Enum) 

GHCiの:

あなたは、おそらく、このような何かを行うことができます
+0

これはまさに私が探していたものです!ありがとう! – FutureShocked

+0

@FutureShocked私はAlecの答えがはるかに良いと思う。あなたは私の代わりにそれを受け入れるべきです。 –

関連する問題