簡體   English   中英

將字符串中的每個其他字母都大寫-列表的取/放與首/尾

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

我以為headtail做了同樣的事情,但是卻收到一條錯誤消息:

> [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 xMaybe Char

[Char.toUpper ( List.head  x)] ++  (List.drop 1 x)

這也是錯誤的,因為Char.toUpper需要Char而不是Maybe Char

在現實生活中,用戶可以通過鍵入非Unicode字符(如表情符號)來破壞此類腳本。 因此,榆樹的反饋也許是正確的。 這應該是一個簡單的問題,它需要使用“ abcde”並變成“ AbCdE”(或可能的“ aBcDe”)。 如何正確處理錯誤?

在Elm中, List.headList.tail都返回它們Maybe類型的,因為任何一個函數都可以傳遞無效的值。 具體來說就是空列表。 某些語言(例如Haskell)在將空列表傳遞到headtail時會引發錯誤,但是Elm嘗試消除盡可能多的運行時錯誤。

因此,如果選擇使用headtail ,則必須顯式處理空列表的例外情況。

注:可能有更好的方法來實現字符串大小寫混合的你的最終目標,但我會集中在headtail的問題,因為這是一個很好的學習工具。

由於您使用的是串聯運算符++ ,因此兩個參數都需要一個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陳述,您可以處理所有可能的結果並將它們映射到適合您的情況的事物。 現在您可以將myHeadmyTail交換到您的代碼中,您應該已經myTail

暫無
暫無

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

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