首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >F#赋值输出和for循环

F#赋值输出和for循环
EN

Stack Overflow用户
提问于 2018-09-18 07:33:43
回答 2查看 518关注 0票数 0

我需要一个F#问题的帮助,这是我在数据科学的第一年得到的。花了好几个小时在这件事上,但还是搞不清楚。

,所以赋值是关于"printf“和循环的,如下所示:

发挥作用: mulTable : n: int ->字符串(因此输入是整数,输出是字符串) 它接受一个参数,并返回一个包含前1 <= n <= 10行的字符串,这样就可以用一个printf "%s“语句打印表。 例如,对mulTable 3的调用应该返回:

我不想看到结果,但也许某种暗示会很有帮助!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-09-18 21:33:33

想出办法!添加一个for循环和一个嵌套的for循环!在嵌套的for循环中,您的打印(i*j)就好像

代码语言:javascript
运行
复制
let function =
    for i = 1 to 10 do 
       for j = 1 to 10 do
          printf "%i" (i*j)
票数 2
EN

Stack Overflow用户

发布于 2018-09-18 21:33:00

以下是一些帮助您入门的提示:

制作字符串而不是印刷

除了打印到屏幕上的printf函数外,F#还有一个类似于printf的函数sprintf,但是它返回一个字符串。例如,

代码语言:javascript
运行
复制
let number = 2 + 3
printf "%i" number  // Prints "5", does not return a value
let text = sprintf "%i" number  // Assigns the string "5" to the variable "text"

有时需要括号

F#语法的一部分可以让新手感到惊讶:函数应用程序的优先级高于运算符。这在实践中意味着什么?那么,看看下面的代码:

代码语言:javascript
运行
复制
let text = sprintf "Sum: %i" 2+3

这个应该还“和: 5",对吗?否:它将给您一个编译器错误,告诉您您不能添加字符串和整数。这是因为当F#看到函数后面跟着任意数量的参数时,它认为函数应用程序(将参数应用于函数)比其他操作符具有更高的优先级。换句话说,就像2+3*4被视为2+(3*4)一样,因为乘法的优先级高于加法,该示例代码的优先级如下所示:

代码语言:javascript
运行
复制
let text = sprintf "Sum: %i" 2+3
// is equivalent to
let text = (sprintf "Sum: %i" 2)+3
// but NOT equivalent to
let text = sprintf "Sum: %i" (2+3)

因此,F#将其处理为let text = (sprintf "Sum: %i" 2)+3,这将成为let text = "2"+3。在像Javascript这样的语言中,这是合法的..。但是你会认为这会产生字符串"5“吗?还是整数5?还是字符串"23"?不太清楚。因此,F#禁止在一起添加两种不同的类型(如字符串和ints),因此对于如何解释任何表达式都不会有歧义。

现在,如果您在我的示例中编写了sprintf行,那么您可能想要的是(2+3)变体。因此,如果您使用的是sprintf (或任何其他函数),而您想传递的东西之一是一个计算值,那么您需要在计算值周围加上括号。这也适用于函数调用的结果:

代码语言:javascript
运行
复制
let double x = x * 2
let text = sprintf "Result: %i" double 5   // Compiler error
let text = sprintf "Result: %i" (double 5) // Returns "Result: 10"

用空格或零填充字符串

如果使用printfsprintf函数打印数字或将数字转换为字符串,则可以在%i格式代码中指定宽度,如下所示:

代码语言:javascript
运行
复制
let shortString = sprintf "%i" 5      // Returns the string "5"
let longString = sprintf "%3i" 5      // Returns the string "  5"
let leftJustified = sprintf "%-3i" 5  // Returns the string "5  "
let zeroPadded = sprintf "%03i" 5     // Returns the string "005"
let tooLong = sprintf "%3i" 9999      // Returns the string "9999"

正如您所看到的,宽度前的-字符将左对齐,这样空格填充将出现在数字之后而不是之前,而宽度之前的0字符将用零代替空格。这个数字永远不会被截断:如果您指定的宽度对于您使用的数字来说太小了(比如在我的示例中试图将9999匹配到宽度为3),那么完整的数字将被打印或返回为一个字符串,这会导致一个比您预期的更大的字符串。

使用for循环创建列表

F#还有一个名为list comprehensions的特性。如果您熟悉Python,它们的工作方式有点像Python的列表理解,但语法(自然)不同。具体来说,F#的列表理解看起来有点像普通的F#代码,但是您可以使用yield关键字将值放入列表中。

代码语言:javascript
运行
复制
// A list of all the numbers from 1 to 10
let numbers = [
    for i = 1 to 10 do
        yield i
]
// A list of all the even numbers from 2 to 20
let evenNumbers = [
    for i = 1 to 10 do
        yield i * 2
]
// You can use nested for loops as well
let nestedLoops = [
    for i = 1 to 10 do
        for j = 1 to i do
            yield i + j
]

组合列表

现在,您可能已经知道了如何将这些概念组合起来,从而生成一个字符串列表,如[" 1"; " 2"; " 3"]等等。假设您有两个列表,每个列表表示要返回的一行文本--假设您希望将它们与中间的\n (换行符)组合起来。你可以这样做:

代码语言:javascript
运行
复制
let combined = list1 @ ["\n"] @ list2

注意,@运算符的意思是“追加两个列表”,因此@两边的内容必须是一个列表。执行list1 @ "\n" @ list2是行不通的,因为字符串"\n"不是一个列表。

但是,如果您的类还没有涵盖列表附加操作符@,那么可以将两个列表与for循环和yield操作符组合起来:

代码语言:javascript
运行
复制
let combined = [
    for x in list1 do
        yield x
    yield "\n"
    for x in list2 do
        yield x
]

这并不是最好的方法(有一个yield!操作符会更好),但更好的方法是更高级的课程,您的教授可能计划稍后报道。如果你想知道他们,留下评论,我会解释(或找到一个很好的解释链接)。

将字符串列表转换为单个字符串

拼图的最后一部分是如何将字符串列表转换为单个字符串。因此,String.concat函数是最好的。它包含两个参数:第一个参数是应该放在每个项之间的字符串(允许为空字符串)。第二个参数是要组合的项的列表。示例:

代码语言:javascript
运行
复制
String.concat "+" ["a"; "b"]  // Returns "a+b"
String.concat "" ["  1"; "  2"; "  3"]  // Returns "  1  2  3"

你可以从这里拿走

这应该是编写函数所需的所有部分。我特意使用了一些与您需要的类似的示例,但并不完全是您所需要的。现在取决于你如何把拼图拼凑在一起并构建你的功能。祝好运!

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52381226

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档