1

私はそれが冗長であることを知っていますが、それが私が構文を学んでいる方法です。この行で

(abCombo'a 2 lst)...'リスト'を返すか、リストを出力したいのですが、この戻りタイプ' Writer[String][Int]'でリストを抽出するのに問題があります。

-- Loop through several integer values
-- and calculate the power of a^b, append to list
abCombo' :: Int -> Int -> [Int] -> Writer [String] [Int]
abCombo' a b lst
    | b == maxB = do
        tell [ "  ... x-Done(1): a^b = " ++ show (a^b) ++ " // " ++ show lst  ]
        return ((a^b):lst)
    | otherwise = do
        tell [ "  ... x-Processing: a^b = " ++ show (a^b) ++ " // " ++ show lst ]
        abCombo' a (b+1) ((a^b):lst)

-- Loop through several integer values
-- and calculate the power of a^b, append to list
abCombo :: Int -> [Int] -> Writer [String] [Int]
abCombo a lst
    | a == maxA = do              
        tell [ "- Done(2): a=" ++ show a ]
        abCombo' a 2 lst
    | otherwise = do
        (abCombo' a 2 lst) <<<<<<<<<<<<<<<<<<<<<< line of interest, here
        tell ["- Processing: a=" ++ show a]
        abCombo (a + 1) lst 

..。

これが上記の現在のコードです。次のように変更します。

abCombo :: Int -> [Int] -> Writer [String] [Int]
abCombo a lst
    | a == maxA = do              
        tell [ "- Done(2): a=" ++ show a ]
        abCombo' a 2 lst
    | otherwise = do
        let res = (abCombo' a 2 lst) <<<<<<<<<<<<<<<<<<<<<< line of interest, here            
        tell ["- Processing: a=" ++ show a]
        abCombo (a + 1) (flatten snd res)
4

1 に答える 1

6

アクションの結果を-blockにバインドするには、の代わりにdo使用する必要があります。<-let

res <- abCombo' a 2 lst      -- res :: [Int]

これは、を使用するとlet、アクション自体に名前を付けるだけだからです。

let res = abCombo' a 2 lst   -- res :: Writer [String] [Int]
于 2012-04-13T13:52:17.230 に答える