gpt4 book ai didi

list - f# System.Char.ToUpper

转载 作者:行者123 更新时间:2023-12-01 11:21:26 25 4
gpt4 key购买 nike

我有一个练习,要求使用将字符串的所有字符转换为大写的函数

System.Char.ToUpper

所以首先我将字符串更改为字符数组并将数组更改为字符列表
let x = s.ToCharArray()
List.ofArray x

接下来,我想我会使用 List.iter 来遍历我的列表并在每个字符上使用 System.Char.ToUpper 函数。
List.iter (fun z -> (System.Char.ToUpper(z)))

但是,这不起作用。我收到一个错误“表达式应该有单位,但这里有字符。”我究竟做错了什么?是逻辑缺陷还是语法缺陷?

最佳答案

这需要一些拆包。

一、你的核心错误:System.Char.ToUpper是一个函数。它需要一个字符并返回另一个字符。它不会以某种方式将其参数“更新”为新值。

let x = 'a'
let y = System.Char.ToUpper x // y = 'A', x = 'a'.

在上面的代码中,我给出了名字 y到函数的结果。 y 的值是 'A' ,但 x 的值仍然是 'a' .调用函数后, x没有改变。

从这个错误开始,其余的一切都随之而来。

第二 , List.iter是一个函数,对于列表的每个元素,它都会“发生”一些事情。它不会用新的东西替换列表的每个元素,也不会创建新的列表。它只是让每个元素都发生一些事情。这种“某事”的最简单示例是打印到控制台:
List.iter (fun x -> printfn "%i" x) [1; 2; 3]  // Prints "1", then "2", then "3"

请注意,此函数有两个参数:表示需要发生的事情的函数,以及从中获取元素的列表。在您的问题中,您似乎缺少第二个论点。怎么会 List.iter知道使用哪个列表吗?
List.iter 的第一个参数需要是返回 unit 的函数.这是 F# 中的一种特殊类型,基本上表示“无值(value)”。当一个函数没有返回值时,这意味着调用它的唯一原因是让外部发生一些事情(在函数式编程中称为“副作用”)。这就是为什么 List.iter要求函数返回 unit - 它是对意外提供错误函数的额外保护,就像你所做的那样,实际上:你提供的函数返回 char .这就是您收到错误的原因。

第三 , 就像 ToUpper , 调用 List.ofArray不会以某种方式“更新” x成为一个列表。相反,它返回一个列表。如果你不给返回的列表命名,它就会丢失。这意味着您调用 List.ofArray 的方式是徒劳的。

你真正需要的是(1)获取字符串中的字符序列,然后(2)将其转换为每个字符大写的新序列,然后(3)将这些字符重新粘合在一起以获得新字符串。

步骤 (1) 是无操作的,因为 .NET 字符串已经是字符序列(即它们实现了 IEnumerable<char> )。步骤 (2) 通过称为 Seq.map 的常用操作完成。 .这是一种通过将给定函数应用于每个元素来将序列转换为新序列的操作。在这种情况下,“给定函数”将是 System.Char.ToUpper .步骤(3)可以通过 String.concat完成,但您需要先将每个字符转换为字符串,因为 String.concat接受一系列字符串,而不是字符。
let chars = s
let upperChars = Seq.map System.Char.ToUpper chars
let strChars = Seq.map string upperChars
let result = String.concat "" strChars

或者这可以以更短的方式完成,无需给每个步骤的结果一个单独的名称,而是通过将每个结果直接传递到下一个操作:
let result = 
s
|> Seq.map System.Char.ToUpper
|> Seq.map string
|> String.concat ""

最后 ,其实还有更短的方法可以做到,但是太明显了,感觉像是在作弊。

问题是,因为字符串是序列,所以它们拥有所有的序列操作是有意义的。你猜怎么着?他们是这样!具体来说,有一个函数 String.map ,与 Seq.map 做同样的事情,但对于字符串:
let result = String.map System.Char.ToUpper s

关于list - f# System.Char.ToUpper,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42310991/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com