我试图效仿这个例子(来自Rob Pickering的"Foundations of F#"书的p137),但我无法使用最新的F#CTP。
我似乎错过了第3行'Value'的定义
Value.GetInfo(x)
这会产生:
错误FS0039:未定义名称空间或模块“值”。
如果现在以不同的方式完成,那么有人能告诉我它的来源或新语法是什么吗? (要温柔 - 这是我第一次玩F#)
以下是我工作的例子: -
#light
open Microsoft.FSharp.Reflection
let printTupleValues x =
match Value.GetInfo(x) with
| TupleValue vals ->
print_string "("
vals
|> List.iteri
(fun i v ->
if i <> List.length vals - 1 then
Printf.printf " %s, " (any_to_string v)
else
print_any v)
print_string " )"
| _ -> print_string "not a tuple"
printTupleValues ("hello world", 1)
答案 0 :(得分:4)
为Beta 1或CTP重写了F#反射库。以下是您的代码略微更改以使用新库,并避免使用F#PlusPack(print_string用于兼容OCaml)。
open Microsoft.FSharp.Reflection
let printTupleValues x =
if FSharpType.IsTuple( x.GetType() ) then
let s =
FSharpValue.GetTupleFields( x )
|> Array.map (fun a -> a.ToString())
|> Array.reduce (fun a b -> sprintf "%s, %s" a b)
printfn "(%s)" s
else
printfn "not a tuple"
printTupleValues ("hello world", 1)
答案 1 :(得分:2)
或者,如果您更喜欢使用match来分解元组,那么请尝试使用活动模式。优点是您可以非常轻松地添加对其他类型的支持。
open Microsoft.FSharp.Reflection
let (|ParseTuple|_|) = function
| o when FSharpType.IsTuple( o.GetType() ) ->
Some( FSharpValue.GetTupleFields(o) )
| _ -> None
let printTupleValues = function
| ParseTuple vals ->
let s =
vals
|> Array.map (fun a -> a.ToString())
|> Array.reduce (fun a b -> sprintf "%s, %s" a b)
printfn "(%s)" s
| _ ->
printf "not a tuple"
printTupleValues ("hello world", 1)
答案 2 :(得分:1)
我不知道您的功能是否已在当前的F#版本中重命名或删除。
您应该查看IDE的对象资源管理器中的FSharp.Reflection
来检查并查看this page。