为什么printfn会立即在f#中打印?

Car*_*bon 4 f#

当我运行以下代码时,我从mySum打印出5050.我已经定义了mySum,但从未调用它.怎么打印呢?也许这很奇怪,因为我的背景是Haskell而且我习惯于传递IO monad来做事情 - 在F#中如何/何时评估事物?

type main = obj [] -> int

let mySum =  [1..100] |> List.sum |> printfn "%i"


[<EntryPoint>]
let main argv = 
    0
Run Code Online (Sandbox Code Playgroud)

Tea*_*Dev 13

我已经定义了mySum,但从未调用它.

mySum不是一个函数,因为它不需要参数.一个函数必须至少有一个参数; 如果没有任何"有用"可以传递,那通常就是unit价值().

mySum是一个价值; 更具体地说,您将表达式的值绑定[1..100] |> List.sum |> printfn "%i"到名称mySum.反过来(),这个值printfn只会导致副作用并返回unit.绑定值时立即计算表达式,剩下的全部是副作用和实际值.

作为一个函数,mySum看起来像这样:

let mySum () =  [1..100] |> List.sum |> printfn "%i"
Run Code Online (Sandbox Code Playgroud)

并称它为简单

mySum ()
Run Code Online (Sandbox Code Playgroud)

这将导致5050打印出值,()并且将自动忽略返回值.

  • 这太奇怪了.有什么价值?是不是5是一个回馈5的功能?非常不同的范例. (3认同)
  • 如果`5`是一个给出'5`的函数,那么第二个`5`也不会是一个给出'5`的函数,依此类推?在某些时候,你必须有价值观.你有机会来自哈斯克尔吗? (3认同)
  • 我个人对Haskell非常有限(而且不是很积极)的经验表明,首先进入F#,Haskell的思维方式并不是很有用,因为语言确实有一些不同的方法.这里要注意的最重要的事情是,与Haskell不同,F#不是纯粹的(功能)语言.一旦F#及其特定的"怪癖"变得更加自然,Haskell的思考可能会再次变得更有价值. (2认同)