2016-01-24 133 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替换为您的代码,并且应该全部设置。

相关问题