Types 为什么可以';t Console.WriteLine确定我的类型?在F#
这是我的密码:Types 为什么可以';t Console.WriteLine确定我的类型?在F#,types,f#,function-composition,Types,F#,Function Composition,这是我的密码: open System let places = [ ("Grandchester", 552); ("Cambridge", 117900); ("Prague", 1188126); ] let statusByPopulation = function | n when n > 1000000 -> "City"
open System
let places = [ ("Grandchester", 552);
("Cambridge", 117900);
("Prague", 1188126); ]
let statusByPopulation = function
| n when n > 1000000 -> "City"
| n when n > 50000 -> "Town"
| _ -> "Village"
System.Console.WriteLine ( places |> List.map (fun (_, population) -> statusByPopulation population))
let print x =
Console.WriteLine (List.map (fun (_, population) -> statusByPopulation population) x) // what I'm trying to do
let something (x:(string * int) list) =
List.map (fun (_, population) -> statusByPopulation population) x; // checking what kinf of type it returns
let print: (string * int) list -> unit =
Console.WriteLine << List.map (fun (_, population) -> statusByPopulation population) // what I'm not allowed to do
System.Console.ReadKey () |> ignore
开放系统
let places=[(“Grandchester”,552);
(“剑桥”,117900);
(“布拉格,1188126);]
让statusByPopulation=函数
|n当n>1000000->“城市”
|n当n>50000时->城镇
|——>“村庄”
System.Console.WriteLine(places |>List.map(fun(|,population)->statusByPopulation))
让打印x=
Console.WriteLine(List.map(fun(u,population)->statusByPopulation)x)//我正在尝试做什么
让某物(x:(字符串*int)列表)=
List.map(fun(u,population)->statusByPopulation)x;//检查它返回的是什么类型的kinf
打印:(字符串*int)列表->单位=
Console.WriteLine statusByPopulation)//我不允许做什么
System.Console.ReadKey()|>忽略
我想熟悉函数组合操作符的工作方式,但由于某种原因,F#无法找到函数的最佳重载
在我显式声明参数的示例中,它将类型设置为val print:x:('a*int)list->unit
,因此,我使用复合运算符在函数中显式设置了类型。F#中的类型推断从左到右进行-这意味着编译器使用程序中早期可用的信息来确定程序中稍后的表达式类型(这是一个稍微简化的过程,但这是一般的想法)
因此,在您的代码中,当您编写:
Console.WriteLine << List.map (fun (_, population) -> statusByPopulation population)
要使原始代码正常工作,您可以提供确定正确的WriteLine
重载是否为使用对象的重载所需的最小信息量。如果您告诉编译器需要获取某个列表,那么它可以选择正确的重载:
(Console.WriteLine:list<_> -> unit) << List.map (fun (_, population) ->
statusByPopulation population)
(控制台写入线:列表->单元)
状态(按人口)
F#中的类型推断是从左到右进行的-这意味着编译器使用程序早期可用的信息来确定程序后期的表达式类型(这是一个稍微简化的过程,但这是一般的想法)
因此,在您的代码中,当您编写:
Console.WriteLine << List.map (fun (_, population) -> statusByPopulation population)
要使原始代码正常工作,您可以提供确定正确的WriteLine
重载是否为使用对象的重载所需的最小信息量。如果您告诉编译器需要获取某个列表,那么它可以选择正确的重载:
(Console.WriteLine:list<_> -> unit) << List.map (fun (_, population) ->
statusByPopulation population)
(控制台写入线:列表->单元)
状态(按人口)
类型推断从左到右工作;使用管道(|>
)调用控制台。WriteLine
。我不想使用管道,我想保存一个参数<我不明白你的意思。x |>List.map(fun(u,population)->statusByPopulation)|>Console.WriteLine有什么问题?(或者更简洁地说,x |>List.map(snd>>statusByPopulation)|>Console.WriteLine
?)我知道它没有回答这个问题,这就是我没有发布答案的原因。挑剔,挑剔…Console.WriteLine有很多重载,类型推断从左到右,从上到下工作,所以如果你把Console.WriteLine放在左边,它不知道你想要哪个重载,当你把它转过来时,它知道你想要“string”类型推断从左到右工作;使用管道(|>
)调用控制台。WriteLine
。我不想使用管道,我想保存一个参数<我不明白你的意思。x |>List.map(fun(u,population)->statusByPopulation)|>Console.WriteLine有什么问题?(或者更简洁地说,x |>List.map(snd>>statusByPopulation)|>Console.WriteLine
?)我知道它没有回答这个问题,这就是我没有发布答案的原因。挑剔,挑剔…Console.WriteLine有很多重载,类型推断从左到右,从上到下工作,所以如果你把Console.WriteLine放在左边,它不知道你想要哪个重载,当你把它转过来时,它知道你想要“string”谢谢,这正是我需要的答案,基本上就是@ildjarn在上面评论中所说的。谢谢,这正是我需要的答案,基本上就是@ildjarn在上面评论中所说的。