假設我有一個整數的串列(x:xs),所以(x:xs) :: Int.
我想在同一行中連接并列印這些整數。因此,當我執行printL [4,3,4]時,我希望該函式能給我"434"作為輸出。
我試著這樣做:
printL :: [Int] ->String
printL (x:xs) = chr x printL xs
我的想法是,對于串列中的每個元素,它將采取頭部(所以x)。用chr函式將其轉換為字串,然后用printL xs將其連接起來(這將再次遞回地進行同樣的步驟)。
正如你所看到的,我被卡住了,而且由于我剛剛開始學習,肯定有很多錯誤。
uj5u.com熱心網友回復:
我的想法是,對于串列中的每個元素,它將采取頭部(所以
x)。
最終,如果你使用遞回,它將呼叫 printL 與一個空的串列,所以你需要涵蓋至少兩種情況:一種是空的串列 [],另一種是非空的串列 (x:xs)。
用
。chr函式將其轉換為一個字串
chr :: Int -> Char將一個給定的Int值轉換為unicode character,其代碼點為你作為引數傳遞的值。因此,它將不創建一個String,并且0將不被映射到'0'字符,而是'NUL'字符。你可以用intToDigit :: Int -> Char來處理這個問題。
然后用
連接它。printL xs
chr x回傳一個Char,所以你不能連接它。你可以使用(:)將其預置到由printL產生的Char串列中。
因此我們可以解決這三個問題,并將其實作為:
import Data.Char(intToDigit)
printL :: [Int] -> String[/span
printL [] = ""/span>
printL (x:xs) = intToDigit x : printL xs
我們這里使用的遞回模式相當于一個map :: (a -> b) -> [a] -> [b]用intToDigit作為映射函式,所以我們可以將其改寫為:
import Data.Char(intToDigit)
printL :: [Int] -> String[/span
printL = map intToDigit
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/329824.html
標籤:
上一篇:Haskellmonad。無法匹配預期型別。(EitherCErrora,[String])與實際型別匹配。錯了,A0B0
