F#问题

海の云 2014-10-03 11:32:32
open System

type LoggingValue<'a> =
| Log of 'a * list<string>

// Listing 12.23 Computation builder that adds logging support

type LoggingBuilder() =
member x.Bind(Log(v, logs1), f) = // Unwrap the value and log buffer
// Run the rest of the computation
let (Log(nv, logs2)) = f(v)
//logs2.
// Wrap the value and merge log buffers
Log(nv, logs1 @ logs2)

// Augment value with an empty log
member x.Return(v) = Log(v, [])
// No value with an empty log
member x.Zero() = Log((), [])

let log = new LoggingBuilder()
let logMessage(s) = Log((), [s])

// Listing 12.24 Logging using computation expressions

// Writes string to console and to the log
let write(s) = log {
do! logMessage("writing: " + s)
Console.Write(s) }

let read() = log {
do! logMessage("reading...")
return Console.ReadLine() }

let testIt () = log {
// Call the primitive logging function
do! logMessage("starting...")
// Call function written using computation expressions
do! write("Enter your name:")
// Using customized value binding
let! name = read()
return "Hello " + name + "!" }

let testShow2 = testIt ();
printfn "%A" testShow2


请问下这里 let (Log(nv, logs2)) = f(v)是什么意思 为什么去掉括号后let Log(nv, logs2) = f(v)
则后面的 Log(nv, logs1 @ logs2) 中nv 和 logs2就看不到了
...全文
460 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
iyomumx 2014-10-04
  • 打赏
  • 举报
回复
这是个值绑定,格式是:
// Binding a value:
let identifier-or-pattern [: type] =
   expression
body-expression
通俗地讲,就是把f(v)的值绑定到一个Log对象上,构成Log对象的元组的两个参数分别用nv和logs2命名以便在接下来的代码中使用。

1,979

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 其他语言讨论
社区管理员
  • 其他语言社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧