标签: f#

如何将setter添加到F#中有区别的联合

我想为有区别的工会添加setter属性,我该怎么做呢?

FE:

type Factor =    
    | Value     of Object
    | Range     of String

    let mutable myProperty = 123
    member this.MyProperty
        with get() = myProperty
        and set(value) = myProperty <- value
Run Code Online (Sandbox Code Playgroud)

f# properties discriminated-union

0
推荐指数
1
解决办法
493
查看次数

枚举的颜色

我的想法是在一些颜色之间切换,所以我不必使用多个笔,但我只能声明一个.

我不太确定能够准确理解枚举是如何工作的,请纠正我:

type ColorType =
  | Red = Color.Red
  | Green = Color.Green
  | Blue = Color.Blue
Run Code Online (Sandbox Code Playgroud)

我希望用它:

let p = new Pen(ColorType.[index])
g.DrawRectangle(p, 0, 0, 10, 10)
Run Code Online (Sandbox Code Playgroud)

其中index是一个int变量(0到2)我将用来切换我的颜色.问题是我无法声明枚举,不接受Color.可能的解决方案?

.net enums f# colors

0
推荐指数
2
解决办法
775
查看次数

需要将F#命令式代码转换为功能性的想法

我有一个功能女巫是以命令式的方式编写的,无法理解如何将其转换为更强大的功能方法.

该函数接受一系列字符串并返回一个seq的元组,其中每个元组由输入中的2,7,12,...和5,10,15,...项组成.

例:

输入= {"Lorem","ipsum","dolor","set","amet","consectetuer","adipiscing","elit","Aenean","commodo","ligula","eget" ,"dolor","Aenean","massa"}

Ouput = {("ipsum","amet"),("adipiscing","commodo"),("eget","massa")}

let convert (input : seq<string>) : seq<(string * string)> =
    let enum = input.GetEnumerator()
    let index = ref 0
    let first = ref ""
    let second = ref ""

    seq {
        while enum.MoveNext() do
            let modIndex = !index % 5
            index := !index + 1

            if (modIndex % 2 = 0 && !first = "") then first := enum.Current
            if (modIndex % 5 = 0 && !second = "") then second …
Run Code Online (Sandbox Code Playgroud)

f# functional-programming imperative

0
推荐指数
1
解决办法
205
查看次数

如何使这个代码更加惯用F#?

我有一个类似于此的函数A,它将函数B应用于目录中的每个文件.每个文件都有一定数量的"条目"; 函数B将当前的条目总数作为参数,并返回当前文件中找到的新条目数.

此外,我需要计算处理的文件数,并在每次处理文件时显示此计数.由于我的命令背景,我提出了2个可变变量和一个for循环.

let files = Directory.EnumerateFiles sourceDirectory
let mutable numEntries = 0
let mutable numFiles = Seq.length files
let mutable index = 0
for file in files do
     printfn "done %d of %d" index numFiles
     let numNewEntries = processFile file numEntries
     numEntries <- numEntries + numNewEntries
     index <- index + 1
Run Code Online (Sandbox Code Playgroud)

那么,有几个问题:

  • 我怎么能用更惯用的功能性风格来写这个呢?
  • 你能解释一下更为惯用的解决方案的优势吗?我对函数式编程很新,有时候我看不出我的循环脏命令有什么问题.

f# functional-programming

0
推荐指数
1
解决办法
409
查看次数

使用F#从头开始构建DataTable

是否可以使用F#从头开始构建DataTable对象

我写了这段代码

module DataHelper
open System
open System.Data
open System.Data.SqlClient

let addDataRow (dt : DataTable) kerberos =
    let dr = dt.NewRow()
    dr["Kerberos"] = kerberos
    dt.Rows.Add(dr)

let Func userList : string seq = 
    let dt : DataTable = new DataTable("UserNameListType")
    let dc : DataColumn = new DataColumn("Kerberos")
    dt.Columns.Add(dc)
    Seq.iter (fun user -> addDataRow dt user) userList
    dt
Run Code Online (Sandbox Code Playgroud)

但这有太多错误

  1. VS.NET似乎不了解DataTable,DataRow类只显示我作为intellisense的"注意".
  2. 很难使用F#中的集合对象Rows,Columns,因为这些方法都没有真正起作用(在C#中很容易使用).

f#

0
推荐指数
1
解决办法
1224
查看次数

如何使用.net数组?

我读到了处理数组时我们应该使用myArray.[i],但是,根据我的经验myArray[i]编译也是如此.

但是,当我想写入.Net中的数组(因此它是可变的)时,这会产生错误 let myArray.[i] = 3但是let myArray[i] =3有效.

处理此类事情的最佳做法是什么?

另外,我应该使用Array.get还是使用.[]

如何将值设置为锯齿状数组,例如 let myArray.[i].[j] = 5

.net arrays f#

0
推荐指数
1
解决办法
137
查看次数

使用Excel Interop混合字符串和数字

我正在使用F#和Excel Interop.我做的事情如下:

workbook.Range("A1:A10").Value2 <- [| "foo"; "3"; "bar"; "6"; "8" |]
Run Code Online (Sandbox Code Playgroud)

当我查看生成的电子表格时,它将"3","6"和"8"存储为字符串而不是数字.这意味着公式等失败.有没有办法让Excel在适当的位置将字符串转换为数字?

我目前的解决方法是:

workbook.Range("A1:A10").Value2 <- [| "foo" :> obj
                                      3 :> obj
                                      "bar" :> obj
                                      6 :> obj
                                      8 :> obj |]
Run Code Online (Sandbox Code Playgroud)

它产生了预期的效果,但它很尴尬.有一个更好的方法吗?

f# excel-interop

0
推荐指数
1
解决办法
130
查看次数

FParsec - 如何从标准输入流解析

我似乎无法使用FParsec成功解析标准输入流.我把我的情况简化为这个非常简单的代码:

match (runParserOnStream (pstring "test" .>> FParsec.CharParsers.newline) () "stdin" (Console.OpenStandardInput ()) Console.InputEncoding) with
    | Success(result, _, _)   -> printfn "Success: %A" result
    | Failure(errorMsg, perr, _) -> printfn "Failure: %s" errorMsg
Run Code Online (Sandbox Code Playgroud)

但是,当我运行程序时,输入字符串测试,然后按Enter,它挂起,我似乎无法弄清楚为什么..

什么是解决方案?

.net f# parsing fparsec

0
推荐指数
1
解决办法
463
查看次数

在F#中构建列表时类型不匹配

我试图从一些文件的名称建立一个列表.不幸的是我收到了一个类型错误,我不知道如何纠正.

我的代码: -

open System

let buildStringList (list: string []) =

      let initial = []
           for i = 0 to list.Length do
              let foo = list.[i]
                 List.append initial foo.Substring(foo.IndexOf("."))
Run Code Online (Sandbox Code Playgroud)

类型错误: -

  error FS0001: This expression was expected to have type string -> 'a
  but here has type string
Run Code Online (Sandbox Code Playgroud)

这与"foo.Substring(foo.IndexOf("."))"对象有关.在这里更正类型的最佳方法是什么?

非常感谢.

f# types list

0
推荐指数
1
解决办法
182
查看次数

F#NameValueCollection to Map

我有一个NameValueCollection,我需要将其转换为Map,我无法解决它.我试过了:

let headerMap (m : MailMessage) = m.Headers |> Map.map (fun k v -> v.[k])
Run Code Online (Sandbox Code Playgroud)

我需要使用Seq.map吗?

基本上,我要将System.Net.MailMessage中的头文件序列化为JSON.

f# json map namevaluecollection mailmessage

0
推荐指数
2
解决办法
529
查看次数