F#在不使用循环的情况下逐字写入一串文本

时间:2017-12-14 22:21:50

标签: f#

我正在使用F#进行函数式编程,而且我对此非常感兴趣。我想逐字打印出一串文字而不使用循环,因为它不被认为是功能性的。我在这里有一种非常原始的方式:

printf "W"
Thread.Sleep(200)
printf "e"
Thread.Sleep(200)
printf "l"
Thread.Sleep(200)
printf "c"
Thread.Sleep(200)
printf "o"
Thread.Sleep(200)
printf "m"
Thread.Sleep(200)
printf "e "

但显然,我不能为150个字符的字符串做到这一点。如果有人能提供一些帮助或指出我正确的方向,那将是最感激的。感谢

1 个答案:

答案 0 :(得分:3)

正如评论中所提到的,阻止线程和打印是副作用,因此它们本身并不是真正的功能。关于F#的好处是,如果需要,你可以轻松做副作用。通常,您将拥有一些核心功能逻辑,从一些代码调用,使用副作用与用户进行交互。

因为你真的需要迭代一个单词,for循环完美地做到了这一点:

let msg = "Welcome"
for c in msg do 
  printf "%c" c
  Thread.Sleep(200)

但是既然你问过更多的功能方法,那么你可以用这个例子来学习一件事就是递归(这在函数式编程中非常重要)。您可以将for循环转换为递归函数,如下所示:

let rec printChars chars = 
  match chars with
  | [] -> ()
  | c::rest ->
      printfn "%c" c
      Thread.Sleep(200)
      printChars rest

let msg = "Welcome"
printChars (List.ofSeq msg)

这不是我通常写的东西 - 因为没有必要让代码更复杂 - 但它是有用的学习练习。