小编Sør*_*ois的帖子

轻量级语法和嵌套记录

这个程序:

type A = { a : int }
type B = { b : A }

//34567890
let r = {
  b = {      // line 6
    a = 2    // line 7 
  } 
}
Run Code Online (Sandbox Code Playgroud)

在mono/fsharpc下产生两次这样的警告:

/Users/debois/git/dcr/foo.fs(7,5):警告FS0058:可能的错误缩进:此标记在位置(6:7)处开始的上下文越位.尝试进一步缩进此标记或使用标准格式约定.

  1. 为什么会出现这种警告?在F#-spec页.228让我觉得'{'后面的标记'a'设置了一个新的越位线,在这种情况下应该没有问题?

  2. 为什么会出现两次?

谢谢,

索伦

全输出:

dcr > fsharpc foo.fs
F# Compiler for F# 3.0 (Open Source Edition)
Freely distributed under the Apache 2.0 Open Source License

/Users/debois/git/dcr/foo.fs(7,5): warning FS0058: Possible incorrect indentation: this token is offside of context …
Run Code Online (Sandbox Code Playgroud)

mono f# nested record

5
推荐指数
1
解决办法
1317
查看次数

f# 中可区分联合的内置比较

在回答这个问题compare时,我发现了受歧视工会的以下行为。

type T = A | B | C | D 
compare A B   (* val it : int = -1 *)
compare A C   (* val it : int = -2 *)
compare A D   (* val it : int = -3 *)
Run Code Online (Sandbox Code Playgroud)

我对此感到惊讶。

我可以compare像这样测量构造函数之间的“距离”吗?

规范(第 154 页)关于生成的compareTo

如果 T 是联合类型,则首先对两个值的联合案例的索引调用 Microsoft.FSharp.Core.Operators.compare,然后对联合案例携带的数据的 x 和 y 的每个相应字段对调用。返回第一个非零结果。

由此,我希望compare类型T总是给出其中之一,-1,0,1因为这就是compare数字类型的行为方式。(正确的?)

f# compare icomparable compareto discriminated-union

5
推荐指数
1
解决办法
1107
查看次数

在使用 Base 的 OCaml 中,如何构造一个包含类型为 `int * int` 的元素的集合?

在 F# 中,我会简单地做:

> let x = Set.empty;;
val x : Set<'a> when 'a : comparison

> Set.add (2,3) x;;
val it : Set<int * int> = set [(2, 3)]
Run Code Online (Sandbox Code Playgroud)

我知道在 OCaml 中,当使用 Base 时,我必须提供一个带有比较函数的模块,例如,如果我的元素类型是 string

let x = Set.empty (module String);;
val x : (string, String.comparator_witness) Set.t = <abstr>

Set.add x "foo";;
- : (string, String.comparator_witness) Set.t = <abstr>
Run Code Online (Sandbox Code Playgroud)

但我不知道如何构造一个具有类型比较函数的模块int * int。我如何构建/获得这样的模块?

ocaml module functor

3
推荐指数
2
解决办法
566
查看次数

如何从aspnet请求体中读取原始xml

我需要HttpController接收原始 XML 并将其传递给遗留代码。我试试这个:

[HttpPost]
[Route("/xml")]
public string Post([FromForm] XDocument xml)
{
    return xml.ToString();
}
Run Code Online (Sandbox Code Playgroud)

然而,该xml文档似乎总是空的,例如,

$ curl -k -X POST https://localhost:5001/xml -d '<foo>bar</foo>' -i
HTTP/1.1 200 OK
Date: Fri, 26 Feb 2021 10:19:23 GMT
Content-Type: text/plain; charset=utf-8
Server: Kestrel
Content-Length: 0

$
Run Code Online (Sandbox Code Playgroud)

如何从请求正文中读取原始 XML 并获取有效的 XDocument?

xml asp.net-core

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

处理元组流而没有可变性?

所以我想要一个接收Tuple <int,int>数组的函数,并返回相同的类型但具有不同的值.

我想要做的是一个返回这种值的函数:

f( [1,10; 2,20; 3,40; 4,70] ) = [2,10; 3,20; 4,30]
Run Code Online (Sandbox Code Playgroud)

所以你可以看到,第一个数字基本没有变化(除了第一个项目没有被选中),但最后一个数字是当前数字与前一个数字的减法(20 - 10 = 10,40 - 20 = 20, ...).

我试图在F#中提出一个不涉及可变性的算法(使用前一个值的累加器意味着我需要一个可变变量),但我无法弄清楚.这可能吗?

f# tuples immutability

2
推荐指数
1
解决办法
364
查看次数

F# 中的元组 vs * 星型

考虑以下代码:

let pair = System.Tuple.Create (10, "foo")       // val pair : int * string = (10, "foo")
let tuple = System.Tuple.Create <| (10, "foo")   // val tuple : System.Tuple<int * string> = ((10, "foo"))
Run Code Online (Sandbox Code Playgroud)
  1. 为什么这两行不产生相同类型的值?(10, "foo")这两行之间的参数类型是否发生了某种变化?
  2. int * string和之间的确切区别是System.Tuple<int * string>什么?

对于 2,至少后者具有null值(这就是这个问题的产生方式)。还有其他区别吗?

f# tuples

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

C++ mktime和DST

我正在处理存储的日期和时间.我将它们以字符串格式(即DDMMYYYYHHMMSS)存储在GMT文件中.当客户端查询时,我将此字符串转换为a struct tm,然后使用将其转换为秒mktime.我这样做是为了检查无效的DateTime.我再次将秒转换为字符串格式.所有这些处理都很好,没有任何问题.

但是我有一个奇怪的问题:我在GMT中存储了日期和时间,也使用了GMT.由于白天节省了光,我的区域设置时间更改为GMT + 1.现在,如果我查询存储的日期和时间,我会减少1小时因为mktime函数使用locale,即GMT + 1,将转换struct tm为秒(tm_isdst设置为-1,因此mktime自动检测夏令时等).

任何想法如何解决这个问题?

c++ mktime

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

从接口实现字符串变量

我正在尝试创建一个继承自接口的包装器.我已经能够从接口实现方法没有问题但是当我尝试为字符串变量执行它时,我不断收到以下错误:

不实现接口成员XXX

执行:

    public string FilterGridId()
    {
        return _WrappedHelper.FilterGridId;
    }

    public string Id()
    {
        return _WrappedHelper.Id;
    }

    public string PagerId()
    {
        return _WrappedHelper.PagerId;
    }
Run Code Online (Sandbox Code Playgroud)

接口的字符串变量:

    string FilterGridId { get; }
    string Id { get; }
    string PagerId { get; }
Run Code Online (Sandbox Code Playgroud)

实施这些的正确方法是什么?

c#

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