4

私は Traveler の実装をまとめており、データ構造を定義することから始めています。を定義しようとしたときに問題が発生しましたShipdata簡単な定義から始めました。

data Ship = Ship Cargo Hull Weapons Engines

data Cargo = WholeMagilla
           | MostOfIt
           | HalfOfIt
           | SomeOfIt

data Hull = Heavy
          | AboveAverage
          | Average
          | Meh

data Weapons = WarMonger
             | BadMofo
             | CautiousCarl
             | Pacifist

data Engines = WarpSuperFast
             | WarpFairlyFast
             | WarpFast
             | Turtle

ここに私の問題があります。他の型の値に基づいて、型が取り得る値を制限したいと考えています。例: 可能Ship性があります

Ship WholeMagilla Heavy Pacifist Turtle
Ship WholeMagilla Meh   WarMonger Turtle
Ship WholeMagilla Meh Pacifist WarpSuperFast

したがって、 aPlayerが十分Creditsにある場合、残りを最小化するという犠牲を払って、せいぜい 2 種類の最大値を持つことができます。次に、その間にすべての可能性があります。パスがすでにそのパスにあるノードによって決定されるグラフの視覚化を開始しました。これは問題について考えるのに役立ちますが、私が望む結果を得る関数を書くのに役立つ方法ではありません。誰かが私を正しい方向に向けることができますか?

4

1 に答える 1

2

「クレジット」をオブジェクトに関連付けて、スマート コンストラクターを使用できます。次に、すべてをモジュールにラップし、Shipユーザーが誤って使用しないように、コンストラクターではなくスマート コンストラクターのみをエクスポートします。

コードは次のとおりです (簡単にするために、コンストラクターを削除しました)。

data Ship = Ship Cargo Hull deriving Show  

class Credit a where                                                       
    credit :: a -> Int   

instance Credit Cargo where
    credit WholeMagilla = 1        
    credit MostOfIt = 2

instance Credit Hull where 
    credit Heavy = 1       
    credit AboveAverage = 2       

data Cargo = WholeMagilla                                                  
           | MostOfIt deriving Show

data Hull = Heavy                                                          
          | AboveAverage deriving Show

max_credit :: Int
max_credit = 3

ship :: Cargo -> Hull -> Ship
ship c h                                                                   
    | credit c + credit h < max_credit = Ship c h 
    | otherwise = error "Too many credits"  

main :: IO ()                                                              
main = do                                                                  
    print $ ship WholeMagilla Heavy     
    print $ ship WholeMagilla AboveAverage                                 
于 2012-08-23T20:01:32.653 に答える