2014-04-05 39 views
0

對於測試應用程序,我試圖將特殊類型的字符串轉換爲元組。該字符串始終採用以下格式,其中int(n> = 1)後跟一個字符。輸入字符串的將字符串轉換爲元組,特殊格式的Haskell

實例:所需的輸出元組(中間體,CHAR)

"2s" 

"13f" 

"1b" 

實例:

(2, 's') 

(13, 'f') 

(1, 'b') 

任何指針將非常理解的。謝謝。

回答

3

您可以使用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) 
0

這裏有一個辦法做到這一點:

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

相關問題