![](/img/trans.png)
[英]Are Maybe String and Maybe Int both Monoids in Haskell?
[英]How to delete “Just” in Maybe String or Maybe Int in Haskell
我是Haskell的新手,並且需要一些幫助。 我有一個XML文件,我想解析其中的兩件事。 一個是一對數字,第二個只是一個字母。 我使用兩個函數來解析每個元素,並且該函數的結果必須為“也許是字符串”,否則它將不起作用。
問題是,當我顯示結果時,它始終附加一個“ Just”。 所以如果我想顯示(1,2)和B
我將擁有(僅“ 1”,“ 2”)和“ B”
對於數字,我得到了解決方案。 我已經使此函數可以處理從對解析中得到的列表:
pair:: [(Maybe String, Maybe String)] -> [(Int, Int)]
pair [] = []
pair ((Just x, Just y) : ls) = (read x, read y) : pair ls
工作正常。 但是我試圖對帶有字母的列表做同樣的事情,但這是行不通的。
這是我的代碼:
letter :: [Maybe String] -> [Char]
letter [] = []
letter (Just x : ls) = read x : letter ls
當我運行它時,我得到正確的配對列表和此錯誤
myfile.hs: Prelude.read: no parse
為什么會這樣呢? 讀取功能有問題嗎?
Char
的read
解析器希望將字符括在單引號中,即,您需要類似"'M'"
的字符串。
Prelude> read "M" :: Char
*** Exception: Prelude.read: no parse
Prelude> read "'M'" :: Char
'M'
您可能想要做類似的事情
letter :: [Maybe String] -> [Char]
letter [] = []
letter (Just [x] : ls) = x : letter ls
但是,這當然僅在您始終僅獲得Just
值而沒有Nothing
值且所有字符串的長度必須為1或模式匹配失敗時才有效。
將字母的定義更改為:
letter :: [Maybe String] -> [Char]
letter [] = []
letter (Just x : ls) = (head x) : letter ls
說明: read
將嘗試以Haskell Char文字形式讀取字符串的內容。 由於Haskell中的Char文字以引號結尾,因此您的字符串需要包含它們(即: read "'B'" :: Char
起作用, read "B" :: Char
不起作用)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.