我想为有区别的工会添加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) 我的想法是在一些颜色之间切换,所以我不必使用多个笔,但我只能声明一个.
我不太确定能够准确理解枚举是如何工作的,请纠正我:
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.可能的解决方案?
我有一个功能女巫是以命令式的方式编写的,无法理解如何将其转换为更强大的功能方法.
该函数接受一系列字符串并返回一个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) 我有一个类似于此的函数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#从头开始构建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)
但这有太多错误
我读到了处理数组时我们应该使用myArray.[i],但是,根据我的经验myArray[i]编译也是如此.
但是,当我想写入.Net中的数组(因此它是可变的)时,这会产生错误 let myArray.[i] = 3但是let myArray[i] =3有效.
处理此类事情的最佳做法是什么?
另外,我应该使用Array.get还是使用.[]?
如何将值设置为锯齿状数组,例如 let myArray.[i].[j] = 5
我正在使用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)
它产生了预期的效果,但它很尴尬.有一个更好的方法吗?
我似乎无法使用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,它挂起,我似乎无法弄清楚为什么..
什么是解决方案?
我试图从一些文件的名称建立一个列表.不幸的是我收到了一个类型错误,我不知道如何纠正.
我的代码: -
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("."))"对象有关.在这里更正类型的最佳方法是什么?
非常感谢.
我有一个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# ×10
.net ×3
arrays ×1
colors ×1
enums ×1
fparsec ×1
imperative ×1
json ×1
list ×1
mailmessage ×1
map ×1
parsing ×1
properties ×1
types ×1