2016-10-31 3 views
0

2つの整数のリストを返す関数worpを作ろうとしています。Haskellで8-xランダム値を取得するにはどうすればよいですか?

整数の最初のリストは、入力リストの長さから8を差し引いた結果です。ダイスはスローします。

2番目のリストは入力リストです。

これは私のコードです:このエラーを取得

import System.Random 

worp :: [Int] -> [[IO Int]] 
worp d = [werpDobbelstenen (8-length d),d] 

werpDobbelstenen :: Int -> [IO Int] 
werpDobbelstenen 0 = [] 
werpDobbelstenen x = randomRIO (1,6):werpDobbelstenen x-1 

イム:あなたを定義し、今

import Control.Monad -- replicateM 
import System.Random -- randomRIO 

werpDobbelstenen :: Int -> IO [Int] 
werpDobbelstenen n = replicateM n (randomRIO (1,6)) 

System.IO> :load "X:\\haskell\\dobbel.hs" 
ERROR file:.\dobbel.hs:17 - Instance of Num [IO Int] required for definitio of werpDobbelstenen 
+0

このコードは、引用しているものとは異なるエラーを引き起こします。完全で正確なエラーメッセージを含めるように質問を編集してください。 – leftaroundabout

+0

sidenote:あなたは 'werpDobbelstenen' tailを再帰的に作ることができます:) – niceman

+0

ところで、' worp'はどのようにコンパイルされますか? '[werpDobbelstenen(8-length d)、d]'は同種のリストではありません!! – niceman

答えて

1

まず、私は簡単にするためにIO [Int]値を返しますworpより簡単には、単にのリストを取るものとして所望のリストの組を返す。

worp' :: [Int] -> ([Int], [Int]) 
worp' d = (d, map (\x -> x - length d) d) 

そして最後に、あなたは単にIO ([Int], [Int])値を取得するためにwerpDobbelstenenの結果の上にworpをマッピングすることができます。もう少し思考の後

worp :: Int -> IO ([Int], [Int]) 
worp n = fmap worp' (werpDobbelstenen n) 

、私はこれがあなたが望むものだと思います。この場合は

import Control.Monad -- replicateM 
import System.Random -- randomRIO 

werpDobbelstenen :: Int -> IO [Int] 
werpDobbelstenen n = replicateM n (randomRIO (1,6)) 

worp' :: [Int] -> IO ([Int], [Int]) 
worp' d = let n = 8 - length d 
      in do d' <- werpDobbelstenen n 
       return (d, d') 

worp :: Int -> IO ([Int], [Int]) 
worp n = werpDobbelstenen n >>= worp' 

>>> worp 6 
([4,1,2,5,6,4],[1,2]) 

、タプルの2番目の値は常にn >= 8のための空のリストです。値が8より大きい場合は、何か違うことをしたいかもしれません。

+0

あなたの実際の質問に私が答えたとは思わない。私の「worp」の定義は実際にあなたが望むリストのペアに対応していません。しかし、私は自分の問題を解決するのに役立つならば、私が提案した 'werpDobbelstenen'の定義に立っています。 – chepner

+0

私は 'import Control.Monad - replicateM'のコメントが好きですが、修飾された' import Control.Monad(replicateM) 'はさらに優れています。 – Franky

+0

はい、ありがとうございます! :)これはまさに私が望んでいたものですが、7行目でタイプミスをしました。「worp」は「worp」でなければなりません。 – ergoforce

関連する問題