0

独自の文字列シャッフル関数を作成しようとしました。

import System.Random

-- usage case: my_shuffle "something" ""

my_shuffle :: [Char] -> [Char] -> [Char]
my_shuffle [] result = result
my_shuffle s result = do 
    pos <- randomRIO (1, length s)
    my_shuffle (remove_char pos) (result ++ (get_char pos))

get_char :: [Char] -> Int -> Char
get_char s pos  = s !! (pos - 1)

remove_char :: [Char] -> Int -> [Char]
remove_char s pos = take (pos - 1) s ++ drop pos s

次のエラーメッセージが返されます。

substitution_cipher.hs:8:16:
    Couldn't match expected type `[t0]' with actual type `IO a0'
    In the return type of a call of `randomRIO'
    In a stmt of a 'do' expression: pos <- randomRIO (1, length s)
    In the expression:
      do { pos <- randomRIO (1, length s);
           my_shuffle (remove_char pos) (result ++ (get_char pos)) }

ご覧のとおり、IOに関連していますが、修正方法がわかりません。

4

1 に答える 1

4

まず第一に、文字列引数をremove_charとに渡していないget_char。また、を使用するには、の結果をget_charリストに変換する必要があります++。への再帰呼び出しは次のmy_shuffleようになります。

my_shuffle (remove_char s pos) (result ++ [get_char s pos])

次に、のIOモナドを使用する必要があるrandomIOため、の署名は次のようにmy_shuffleなります。

my_shuffle :: [Char] -> [Char] -> IO [Char]

次に、最後にreturn基本ケースで使用する必要があります(を返す必要があるためIO [Char]):

my_shuffle [] result = return result

修正が適用された場合:

import System.Random

my_shuffle :: [Char] -> [Char] -> IO [Char]
my_shuffle [] result = return result
my_shuffle s result = do
     pos <- randomRIO (1, length s)
     my_shuffle (remove_char s pos) (result ++ [get_char s pos])

get_char :: [Char] -> Int -> Char
get_char s pos  = s !! (pos - 1)

remove_char :: [Char] -> Int -> [Char]
remove_char s pos = take (pos - 1) s ++ drop pos s
于 2012-10-29T14:25:47.123 に答える