0

こんにちは、エースは 1 または 11 になる可能性があるため、ハンドの合計に問題があります。ハンド、つまり [カード] を取り、合計値を計算する関数を作成するにはどうすればよいですか?

これが私がこれまでに持っているものです:

handValue :: [Card]->[Int]
handValue [] = 0
handValue (x:xs) = sum((val x)++([handValue xs]))

ここで、val は既に定義されており、カードから値の配列を返します。例 val ("Ace","Hearts") は [1,11] を返します val ("Five","Hearts") は [5] を返します

任意のポインタをいただければ幸いです。

編集:duplodesの提案の後、私はこれを持っています:

    handValue :: [Card]->[Int]
handValue [] = 0
handValue (x:xs) = 
            if (val x ==[1,11])
            then    (map sum (sequence [[1,11], handValue xs]))
                else [ sum [(val x)]++([handValue xs])]
4

2 に答える 2

1

関数を修正するだけでなく、そもそも機能しなかった理由に注意を払う必要があります。まず、あなたが与えたタイプは

handValue :: [Card] -> [Int]

ただし、再帰的な定義には、結果の型としてリストではなく単一の値があります (0最初の式のリテラル; 2 番目の式の の使用sum) Num a => [a] -> a

ここで、型が に変更されたと仮定する[Card] -> Intと、定義は有効になりますが、結果は奇妙になります。あなたの2番目の方程式は次のとおりです。

handValue (x:xs) = sum((val x)++([handValue xs]))

xエースの場合はどうなりますか?val xになる[1, 11]ため、両方の値が連結されて合計に含まれます。つまり、エースは 1 または 11 ではなく 12 ポイントとしてカウントされるようになりました。nmのソリューション、ここで言い換えると

Prelude> map sum . sequence $ [[1,11], [5], [6]]
[12,22]

エースのすべての可能な選択肢の値のリストを生成し( )、sequenceすべての可能性を個別に合計する( ) ことで問題を回避し、値のリストを生成map sumします (最初に与えた署名のように)。ただし、最終的には可能性の 1 つを決定する必要があるため、これで問題が完全に解決されるわけではありません。そして、別の質問をするのに十分な資料が揃っている可能性があります。

于 2013-10-25T18:35:09.470 に答える
1
Prelude Control.Monad> liftM sum . sequence $ [[1,11], [5], [6]]
[12,22]
于 2013-10-25T17:32:24.037 に答える