[英]Capitalize Every Other Letter in a String — take / drop versus head / tail for Lists
在過去的一兩個下午里,我一直在電腦上戳戳,好像以前從未見過。 今天的話題清單
練習是取一個字符串並大寫其他字母 。 我沒有走很遠...
讓我們以列表x = String.toList "abcde"
進行分析。 如果我們將take 1
的結果與drop 1
的結果相加,則會返回原始列表
> x = String.toList "abcde"
['a','b','c','d','e'] : List Char
> (List.take 1 x) ++ (List.drop 1 x)
['a','b','c','d','e'] : List Char
我以為head
和tail
做了同樣的事情,但是卻收到一條錯誤消息:
> [List.head x] ++ (List.tail x)
==================================== ERRORS ====================================
-- TYPE MISMATCH --------------------------------------------- repl-temp-000.elm
The right argument of (++) is causing a type mismatch.
7│ [List.head x] ++ (List.tail x)
^^^^^^^^^^^
(++) is expecting the right argument to be a:
List (Maybe Char)
But the right argument is:
Maybe (List Char)
Hint: I always figure out the type of the left argument first and if it is
acceptable on its own, I assume it is "correct" in subsequent checks. So the
problem may actually be in how the left and right arguments interact.
錯誤消息告訴我很多錯誤。 並非100%知道我將如何解決。 加入運算符++
的列表期望[Maybe Char]
,而是得到Maybe [Char]
讓我們嘗試大寫字符串中的第一個字母(雖然不太酷,但實際上是現實的)。
[String.toUpper ( List.head x)] ++ (List.drop 1 x)
這是錯誤的,因為Char.toUpper
需要String
,而List.head x
是Maybe Char
。
[Char.toUpper ( List.head x)] ++ (List.drop 1 x)
這也是錯誤的,因為Char.toUpper
需要Char
而不是Maybe Char
。
在現實生活中,用戶可以通過鍵入非Unicode字符(如表情符號)來破壞此類腳本。 因此,榆樹的反饋也許是正確的。 這應該是一個簡單的問題,它需要使用“ abcde”並變成“ AbCdE”(或可能的“ aBcDe”)。 如何正確處理錯誤?
在Elm中, List.head
和List.tail
都返回它們Maybe
類型的,因為任何一個函數都可以傳遞無效的值。 具體來說就是空列表。 某些語言(例如Haskell)在將空列表傳遞到head
或tail
時會引發錯誤,但是Elm嘗試消除盡可能多的運行時錯誤。
因此,如果選擇使用head
或tail
,則必須顯式處理空列表的例外情況。
注:可能有更好的方法來實現字符串大小寫混合的你的最終目標,但我會集中在head
和tail
的問題,因為這是一個很好的學習工具。
由於您使用的是串聯運算符++
,因此兩個參數都需要一個List,因此可以肯定地說您可以創建幾個函數來處理Maybe
返回值並將它們轉換為空列表,這將允許您可以使用串聯運算符。
myHead list =
case List.head list of
Just h -> [h]
Nothing -> []
myTail list =
case List.tail list of
Just t -> t
Nothing -> []
使用上面的case
陳述,您可以處理所有可能的結果並將它們映射到適合您的情況的事物。 現在您可以將myHead
和myTail
交換到您的代碼中,您應該已經myTail
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.