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