0

getnumfrmcard(xs)の最初の引数と(<)の2番目の引数、つまり関数straight(の手がカードはストレートです)

enter code here
  data Card = Cards (Suit,Face) deriving (Eq)
  data Hand=  Hands[Card]

   straight:: Hand->Bool
   straight (Hands [] )                                     =True
   straight (Hands (x:xs) )                
            | null(xs)==True                          = True
            | getnumfrmcard (x)  < getnumfrmcard (xs) =straight (Hands xs)
            | otherwise                               = False
4

3 に答える 3

4

このエラーは、関数getnumfrmcardが型の引数を期待しているが、 (カードのリスト)Cardが与えられていることを示しています。[Card]犯人は、最後から 2 番目の行ですgetnumfrmcard (xs)。リストを照合すると、リストの先頭 (単一の要素) に(x:xs)なり、リストである末尾になります。そうでxxs

f []     = []
f (x:xs) = xs

f [1,2,3] -- [2,3]

xsにバインドされてい[2,3]ます。

に対して照合することもでき(Hands (x0:x1:xs))ますが、引数が 1 つしかないリストをどのように処理するかを決定する必要があります (実際に何をしようとしているのかについては考えていません)。

getnumfrmcard (xs)また、注意: 通常、Haskell では関数の引数を括弧で囲む必要はないため、代わりにgetnumfrmcard xs.

于 2013-01-27T15:47:31.563 に答える
1

また、ストレートがあるかどうかを確認したい場合は、各カードが次のカードよりも低いかどうかを確認するだけでは不十分で、1枚低くする必要があります。

もっとHaskell-yの解決策が思い浮かびます:

straight (Hands cards) = and $ zipWith nextStraight cards (tail cards)
   where nextStraight c c' = getnumfrmcard c' == getnumfrmcard c+1

zipWith nextStraight cards (tail cards)関数(2枚のカードが隣接する値であるかどうかをチェックするcards関数)によって、隣接する要素のすべてのペアを結合します。次に、すべてのペアが述語を検証するnextStraight必要があることを要求することにより、結果のブールリストを結合します(したがって関数)。and

もちろん、この方法が機能するためには、事前に手をソートする必要があります。そうしないと、一部のストレートが検出されません(たとえば、[2H、3D、5S、4D、6C])。

于 2013-01-28T12:37:31.097 に答える
0

Haskellでのコーディングはそれほど明白ではありません。質問にコードを追加して、質問が増えないようにします:)したがって、ポールの回答に基づく回答は次のようになります。

module Test where

data Card = Cards (Int, Int) deriving (Eq, Ord)
data Hand = Hands [Card]

straight :: Hand -> Bool
straight (Hands [] ) = True
straight (Hands [x0] ) = True
straight (Hands (x0:x1:xs) )
    | null(xs) == True = True
    | x0 < x1 = straight (Hands xs)
    | otherwise = False

main :: IO ()
main = print $ straight $ Hands [Cards (5,1), Cards(4,4)]

これを自由に編集してください

于 2013-01-27T17:30:49.497 に答える