F#从List创建类型

时间:2017-07-29 20:22:32

标签: types f# type-conversion

我正在从控制台输入中读取数据,并希望将我读取的字符串转换为自定义类型。我正在拆分我读取的字符串然后尝试实例化我的自定义类型得到了一个我不明白的编译错误。

我将阅读的输入示例(在一行中):

  

1; Maison de la Prevention Sante; 6 rue Maguelone 340000 Montpellier ;; 3,87952263361082; 43,4071285339217

代码示例:

let input () = Console.In.ReadLine()

type Coordinate = {Longitude:float; Latitude:float}
type Defibrillator = {Name:string; Coordinate:Coordinate} // I only need name and coordinate

let readDefribillator = 
   input().Split(';') 
   |> {Name=""; Coordinate={Longitude=1.0; Latitude=2.0}} // Don't know how to do this

错误(在线上|> {Name = ...)

  

此表达式的类型为'string [] - > 'a'但这里有'Defibrillator'类型

感谢您的帮助

2 个答案:

答案 0 :(得分:3)

如果您将逗号更改为输入数字中的点,则可以这样做。

let readDefribillator =
    let values = input().Split(';')
    { Name = values.[1]; Coordinate = { Longitude = float values.[4]; Latitude = float values.[5] } }

如果您的数字包含逗号,则可以使用本地或特定文化进行转换,使用函数Single.Parse,Double.Parse,Convert.ToSingle或Convert.ToDouble。这些函数具有带额外参数的版本。如果您不使用额外参数,则会显示将使用本地文化,因此您只需执行以下操作即可。您的语言环境可能会出现逗号而不是点,但对于美国语言环境,如果输入逗号,则会失败。换句话说,这里使用的函数是区域敏感的。

let readDefribillator =
    let values = input().Split(';')
    let x = Convert.ToDouble values.[4]
    let y = Convert.ToDouble values.[5]
    { Name = values.[1]; Coordinate = { Longitude = x; Latitude = y } }

如果您希望输入始终使用逗号或点,则使用这些函数的额外参数指定特定的文化。有预定义的文化。我不会在这里讨论所有这些。

看起来你开始学习F#了。 StackOverflow不是一个提问这样的问题的好地方。我建议您加入我们https://fsharp.slack.com,欢迎任何类型的问题。

答案 1 :(得分:3)

我建议

open System

type Coordinate = {Longitude:float; Latitude:float}
type Defibrillator = {Name:string; Coordinate:Coordinate} 

[<EntryPoint>]
let main argv = 
    let input  = Console.ReadLine()
    let readDefribillator = 
       input.Split(';') 
       |> fun x -> {Name=""; Coordinate = {
       Longitude = float (x.[4].Replace(",",".")) 
       Latitude =float (x.[5].Replace(",","."))
       }}
    printfn "%A" readDefribillator
    Console.ReadLine |> ignore
    0

其中

  1. fun x ->正在处理输入字符串数组
  2. x.[4]x.[5]正在选择坐标
  3. .Replace(",",".")正在格式化float
  4. 所需的数字