[英]Is there a way to split a string containing two paths to a list\tuple containing the paths?
[英]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 !! 0
和xs !! 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
列表不需要您提供的相等約束,因為編譯器已經知道String
是Eq
的實例。
其次,要在where子句的位置(看起來像)中使用列表理解語法。 考慮到Haskell將嘗試評估xs !! 0
綁定元素x
之前為xs !! 0
。 因為這是一個列表推導,所以可能不會立即失敗,因為xs
是String
的列表(實際上是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.