簡體   English   中英

如何在Haskell的Maybe String或Maybe Int中刪除“ Just”

[英]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

為什么會這樣呢? 讀取功能有問題嗎?

Charread解析器希望將字符括在單引號中,即,您需要類似"'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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM