小编Rub*_*ink的帖子

如何在f#中将记录字段定义为数组?

我想创建一个包含8个元素的字节数组类型的记录字段,但无法找出正确的语法.

我做了类似的事情:

let dataRecord = {
    id : int
    data : byte array 
}

let dataValues : byte array = Array.zeroCreate 8

let myArray = { id = 0; data = dataValues }
Run Code Online (Sandbox Code Playgroud)

可以在记录定义中完成吗?怎么样?

我上面的例子似乎有效,但我不知道它是安全还是最好或最正确的方式.

arrays f# record

3
推荐指数
1
解决办法
867
查看次数

F#:从用户输入创建整数集合

我对F#很新,所以问题可能相当简单.不过,我找不到任何关于SO的建议.

我正在玩F#中的算法任务.作为第一步,我想从用户控制台输入创建一个整数集合.未定义输入数量.而且我不会使用任何while循环.我希望尽可能多的惯用法.

在递归函数中,我正在读取结果并使用它进行解析Int32.TryParse.我使用匹配bool结果match ... with.如果成功,那么我将一个新值附加到集合.否则我会退回收藏品.

以下是我的代码:

let rec getNumList listSoFar =
    let ok, num = Int32.TryParse(Console.ReadLine())
    match ok with
        | false -> listSoFar
        | true -> getNumList num::listSoFar

let l = getNumList []
Run Code Online (Sandbox Code Playgroud)

我得到的错误:

类型不匹配.期待一个'a
但是给'一个列表

我知道我使用的类型不正确,但我不明白到底出了什么问题.任何解释都高度赞赏.

f#

3
推荐指数
1
解决办法
234
查看次数

将函数作为参数传递并使其超载

我想计算我的功能,其中一些最多使用三个参数.现在我正在使用下面相同的代码,其中包含三种变体.

let GetTime f (args : string) = 
    let sw = Stopwatch.StartNew()
    f (args)
    printfn "%s : %A" sw.Elapsed 
Run Code Online (Sandbox Code Playgroud)

我想用这个替换三个函数.

let GetTime f ( args : 'T[]) =
    let sW = Stopwatch.StartNew()
    match args.Length with
    | 1 -> f args.[0]
    | 2 -> f (args.[0] args.[1])
    printfn "%A" sW.Elapsed
    ()
Run Code Online (Sandbox Code Playgroud)

但是如果我使用它运行的三个函数,我会收到类型不匹配的错误.是否可以将函数作为参数发送并像这样使用它?

f# parametric-polymorphism

3
推荐指数
1
解决办法
217
查看次数

自动混合AutoData错误 - 未提供任何参数

我试图通过以下方式在AutoFixture中使用AutoData功能进行NUnit测试:

[Test]
[AutoData]
public void PharmaciesAndDelegatesShouldBeLinkedEachOther(string s) {
    ...
}
Run Code Online (Sandbox Code Playgroud)

但是,我在运行测试时收到以下错误.只要我没有传递该参数,测试中的其他所有内容都能正常工作:

结果消息:未提供任何参数.

我究竟做错了什么?

.net nunit moq autofixture

3
推荐指数
1
解决办法
1488
查看次数

F# - 将Array转换为list

我正在将文件读入如下的数组(注意我知道这是错误的代码):

let filename = if argv.[0] != null then argv.[0] else System.Console.ReadLine()
let data = File.ReadAllLines(filename)
Run Code Online (Sandbox Code Playgroud)

我想对map上面一行返回的数据执行F#.我的问题是,我只能执行mapN·#名单上,而不是System.String[]那个File.ReadAllLines()返回.我可以将标准.Net数组转换为F#列表.我确信我可以用不同的方式读取文件,或者通过手动将数组内容复制到列表来实现,但如果有一种简单的方法可以做到这一点会更容易.

arrays f# list

3
推荐指数
1
解决办法
3601
查看次数

将逗号分隔的字符串列表转换为整数列表的列表

我有这样的数据集

1,2
3,4
5,6
7,8
9,0
Run Code Online (Sandbox Code Playgroud)

当我使用ReadAllLines读取它时,我得到一个字符串数组.到目前为止,我已经将字符串转换为包含字符串的列表数组

[["1";"2"];["3";"4"]... etc
Run Code Online (Sandbox Code Playgroud)

我需要最后一步才能得到这个 [[1;1;[1;4]... etc

我的代码现在:

module Data =
    let load(path : string) (filename : string) =
        System.IO.File.ReadAllLines(path + "\" + filename) 
        |> Array.toList
        |> Seq.map (fun s -> s.Split [|','|] |> Array.toList)
        |> Seq.map (fun s -> s |> Seq.map System.Int32.Parse)
Run Code Online (Sandbox Code Playgroud)

这是我测试它时返回的内容

val it : seq<seq<int>> = seq [seq [1; 2]; seq [3; 4]; seq [5; 6]]
Run Code Online (Sandbox Code Playgroud)

我期待这样的事情

val zz : int list list = [[1; 2]; [3; 4]]
Run Code Online (Sandbox Code Playgroud)

f#

3
推荐指数
1
解决办法
380
查看次数

使用自定义目标将所有NLog输出重定向到Serilog

作为从NLog切换到Serilog的一个步骤,我想将NLog标准调用的标准接线重定向LogManager.GetLogger(name)到桥接任何记录到NLog的代码,立即转发到环境Serilog Log.Logger- 即我只想转发一个简单转发的配置消息,没有像Log4net.Appender.SerilogLog4net 那样缓冲.

任何人都可以编造或指向一个规范的片段,正确有效地做到这一点吗?我能想到的要求:

  • 保持水平,即nlog.Warn应该相当于serilog.Warning
  • Serilog可以重新产生时间
  • 在appender中实现消息 - 即,不需要维护与'message'相关的任何属性(LogEvent在Serilog术语中)
  • 没有缓冲
  • 我不需要使用任何其他NLog目标(即改变/删除消息会很好)

porting nlog target sink serilog

3
推荐指数
1
解决办法
681
查看次数

事件溯源对机器学习有帮助吗

我是事件溯源、事件存储、消息存储和机器学习的新手。

我们正计划实施消息存储,他们提到实施消息存储(而不是传统的 db、crud)的原因是因为消息存储最终有助于深度学习或机器学习。

我对事件存储、CQRS 有基本的了解,但无法理解它与机器学习的关系。

machine-learning database-migration cqrs event-sourcing microservices

3
推荐指数
1
解决办法
407
查看次数

尝试将流事件附加到 EventStore 引发异常

我目前正在开始使用EventStore,我正在遵循入门指南。我只是在第一步卡住了,不知道我做错了什么......

我现在使用的版本是20.6.0

我正在尝试使用 .NET Core Client 将事件写入我的本地实例(该实例正在运行,因为我可以使用 AdminUI 添加事件)。但我得到一个例外,如One or more errors occurred. (Connection 'ES-41230054-2026-4cdb-b2bb-a35824779863' was closed.)'.

尝试修复它一段时间后,我转到.Net Client 指南并粘贴了完全相同的代码:

        public static void Main()
        {
            var conn = EventStoreConnection.Create(new Uri("tcp://admin:changeit@localhost:1113"));
            conn.ConnectAsync().Wait();

            var data = Encoding.UTF8.GetBytes("{\"a\":\"2\"}");
            var metadata = Encoding.UTF8.GetBytes("{}");
            var evt = new EventData(Guid.NewGuid(), "testEvent", true, data, metadata);

            conn.AppendToStreamAsync("test-stream", ExpectedVersion.Any, evt).Wait();

            var streamEvents = conn.ReadStreamEventsForwardAsync("test-stream", 0, 1, false).Result;
            var returnedEvent = streamEvents.Events[0].Event;

            Console.WriteLine("Read event with data: {0}, metadata: {1}",
                Encoding.UTF8.GetString(returnedEvent.Data), …
Run Code Online (Sandbox Code Playgroud)

c# .net-core eventstoredb

3
推荐指数
1
解决办法
970
查看次数

F# 如何停止 Async.Start

您好,我有一个关于 F# 中异步的问题。

因此,我有一个在后台运行的简单过程,该过程放置在类型的成员中,如下所示:

type Sender() = 
     member this.Start(udpConectionPool) = async {
        (* Some operation that continuously sends something over udp*)
     } |> Async.Start
Run Code Online (Sandbox Code Playgroud)

因此,这开始并开始通过 UDP 连续发送帧,而不阻塞程序的其余部分,但有时我想重新启动线程(假设我想添加新端点,它将发送到该udpConnectionPool参数)。

我正在考虑将任务转储给成员之类的事情,然后:

member this.Stop() = async {
    do! (*stop async start member that contains task*)
}
Run Code Online (Sandbox Code Playgroud)

然后我可以使用更新的连接池重新启动此任务,但我不知道是否可以做到这一点。

我的问题是,是否可以停止这样的任务,或者如果不能,是否有更好的方法来完成?

f#

3
推荐指数
1
解决办法
266
查看次数