簡體   English   中英

以元組形式包含列表中前兩個字符串的返回列表

[英]Return list containing the first two strings in the list as a tuple

我正在編寫一個Haskell函數,該函數接受一個字符串列表,並返回一個包含前兩個字符串作為結果的元組的列表。 因此,示例輸出為:

listtuple ["bride", "zilla", "crazy", "women"] = [("bride", "villa")]
listtuple ["basketball", "football"] = [("basketball", "football")]

我想像這樣處理它的方式:

listtuple :: Eq a => [Str a] -> [(Str a, Str a)]
listtuple xs = [(x,y) | x <- xs !! 0, y <- xs !! 1]

從本質上講,我認為我只可以選擇列表的第一個索引和第二個索引中的元素,但是卻遇到了錯誤。 這里有什么幫助嗎?

簡單的答案是

listtuple :: [a] -> [(a,a)]
listtuple (x:y:_) = [(x,y)]
listtuple _ = []

由於您的列表將始終只包含一項或不包含任何一項,因此最好使用Maybe來精確地為此目的服務。

listtuple2 :: [a] -> Maybe (a,a)
listtuple2 (x:y:_) = Just (x,y)
listtuple2 _ = Nothing

您可能想做的是:

listtuple xs =
    let x = xs !! 0
        y = xs !! 1
     in (x, y)

請注意,這與您編寫的內容不同。 原因是您編寫的列表理解轉換為以下內容:

do x <- xs !! 0  -- Treat the first  element of xs as a list
   y <- xs !! 1  -- Treat the second element of xs as a list
   return (x, y)

這說明了問題:您正在處理xs !! 0 xs !! 0xs !! 1 當它們不是列表時為xs !! 1 xs !! 0 xs !! 0只是一個元素,因此如果要聲明x等於xs !! 0 xs !! 0 ,您使用:

let x = xs !! 0
 in <some expression that uses x>

<- list comprehension語法不會做同樣的事情,我建議您避免使用列表理解,直到您了解list monad的工作方式為止,因為編譯器會將列表推導轉換為list monad。

現在,第二個問題是您使用(!!) 您應該避免使用(!!)類的部分函數,​​而應集中精力使用模式匹配來解決這些問題。 完成請求的慣用方式是在前兩個元素上進行模式匹配:

listtuple (x:y:_) = (x, y)

...否則將在包含少於兩個元素的列表上失敗。 您可以通過將結果存儲為Maybe防止發生這種情況,其中Just包裹成功的結果, Nothing表示失敗:

listtuple :: [a] -> Maybe (a, a)
listtuple (x:y:_) = Just (x, y)
listtuple _       = Nothing

我可以看到您的代碼中有一些錯誤,但是如果您有一個特定的問題要問為什么您的代碼不起作用,請告訴我。

首先,您提供的類型簽名無效。 String是無參數的數據結構, Str a則不是,除非您自己定義了一個名為Str的數據結構。 String列表不需要您提供的相等約束,因為編譯器已經知道StringEq的實例。

其次,要在where子句的位置(看起來像)中使用列表理解語法。 考慮到Haskell將嘗試評估xs !! 0 綁定元素x之前為xs !! 0 因為這是一個列表推導,所以可能不會立即失敗,因為xsString的列表(實際上是Char列表),但是最終會得到從xs中的第一和第二個字符串中提取出的Char的元組。

這是一個使用模式匹配的簡單解決方案,可以產生所需的結果。

listtuple :: [a] -> [(a, a)]
listtuple (x:y:zs) = [(x, y)]

請注意,這不是全部功能(即,如果將少於兩個元素的列表傳遞給它,則會導致錯誤)。 當將一個空列表或一個元素列表傳遞給空列表時,也許可以通過返回空列表來實現總計,這是否可以達到您的預期目的?

這是一個替代版本,您可能會發現它適合您用來編寫自己的版本的思維模型。

listtuple xs = [(x, y)]
            where
                x = xs !! 0
                y = xs !! 1

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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