對於測試應用程序,我試圖將特殊類型的字符串轉換爲元組。該字符串始終採用以下格式,其中int(n> = 1)後跟一個字符。輸入字符串的將字符串轉換爲元組,特殊格式的Haskell
實例:所需的輸出元組(中間體,CHAR)的
"2s"
"13f"
"1b"
實例:
(2, 's')
(13, 'f')
(1, 'b')
任何指針將非常理解的。謝謝。
對於測試應用程序,我試圖將特殊類型的字符串轉換爲元組。該字符串始終採用以下格式,其中int(n> = 1)後跟一個字符。輸入字符串的將字符串轉換爲元組,特殊格式的Haskell
實例:所需的輸出元組(中間體,CHAR)的
"2s"
"13f"
"1b"
實例:
(2, 's')
(13, 'f')
(1, 'b')
任何指針將非常理解的。謝謝。
您可以使用readS
解析int和得到字符串的其餘部分:
readTup :: String -> (Int, Char)
readTup s = (n, head rest)
where [(n, rest)] = reads s
一個更安全的版本是:
maybeReadTup :: String -> Maybe (Int, Char)
maybeReadTup s = do
[(n, [c])] <- return $ reads s
return (n, c)
這裏有一個辦法做到這一點:
import Data.Maybe (listToMaybe)
parseTuple :: String -> Maybe (Int, Char)
parseTuple s = do
(int, (char:_)) <- listToMaybe $ reads s
return (int, char)
這使用Monad來表示可能的解析失敗。請注意,如果(char:_)
模式不匹配(即,如果只有一個沒有任何字符的數字),則會將其轉換爲Nothing
結果(這歸結於do
表示法在Haskell中的工作原理),它調用fail
函數Monad
如果模式匹配失敗。在Maybe a
的情況下,我們有fail _ = Nothing
)。如果reads
在輸入開始時無法讀取Int
,則該函數的計算結果爲Nothing
。如果發生這種情況,reads
給出[]
然後通過listToMaybe
變成Nothing
。