2016-01-24 103 views
1

我花了過去的一兩個下午或兩個戳到我的電腦上,就好像我以前從未見過一樣。今天的話題列表將字符串中的每一個其他字母都大寫 - 列表中的每個其他字母大寫


的練習是一個字符串並將利用其他字母。我沒有走得太遠......

讓我們列出x = String.toList "abcde"並嘗試分析它。如果我們加take 1drop 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」)。如何正確處理錯誤?

回答

1

在榆樹,List.headList.tail都返回他們Maybe類型,因爲無論是功能可以通過一個無效的值;特別是空的列表。有些語言,如Haskell,在將空列表傳遞給headtail時會拋出錯誤,但是Elm會嘗試儘可能多地消除運行時錯誤。

因此,如果您選擇使用headtail,則必須明確處理空列表的特殊情況。

注意:有可能有更好的方法來實現字符串混合大寫的最終目標,但我將重點討論headtail問題,因爲它是一個很好的學習工具。

由於您使用的連接符,++,你需要兩個參數的列表,所以它可以安全地說,你可以創建一個處理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替換爲您的代碼,並且應該全部設置。

相關問題