我正在使用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个字符的字符串做到这一点。如果有人能提供一些帮助或指出我正确的方向,那将是最感激的。感谢
答案 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)
这不是我通常写的东西 - 因为没有必要让代码更复杂 - 但它是有用的学习练习。