小编Dav*_*erk的帖子

F#中命名空间和模块之间的区别是什么?

我刚开始学习F#(之前几乎没有.NET经验),请原谅我可能是一个非常简单的问题:F#中命名空间和模块之间的区别是什么?

谢谢

戴夫

编辑:谢谢Brian的回答.这就是我想知道的.只是澄清:您是否也可以打开命名空间(类似于C#using语句)?

f# namespaces module

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

了解F#值限制错误

我不明白F#中的价值限制是如何运作的.我已经阅读了wiki中的解释以及MSDN文档.我不明白的是:

  1. 例如,为什么这给了我一个价值限制错误(取自这个问题):

    let toleq (e:float<_>) a b = (abs ( a - b ) ) < e
    
    Run Code Online (Sandbox Code Playgroud)

    但这不是:

    let toleq e (a:float<_>) b = (abs ( a - b ) ) < e
    
    Run Code Online (Sandbox Code Playgroud)
  2. 这一点可以概括......

    let is_bigger a b = a < b
    
    Run Code Online (Sandbox Code Playgroud)

    但这不是(它被指定为int):

    let add a b = a + b
    
    Run Code Online (Sandbox Code Playgroud)
  3. 为什么带隐式参数的函数会生成值限制:

    这个:

    let item_count = List.fold (fun acc _ -> 1 + acc) 0
    
    Run Code Online (Sandbox Code Playgroud)

    对此:

    let item_count l = List.fold (fun acc _ …
    Run Code Online (Sandbox Code Playgroud)

f# type-inference value-restriction

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

我怎么知道函数是否在F#中是尾递归的

我写了以下函数:

let str2lst str =
    let rec f s acc =
      match s with
        | "" -> acc
        | _  -> f (s.Substring 1) (s.[0]::acc)
    f str []
Run Code Online (Sandbox Code Playgroud)

如何知道F#编译器是否将其转换为循环?有没有办法在不使用Reflector的情况下找出答案(我没有使用Reflector的经验而且我不知道C#)?

编辑:另外,是否可以在不使用内部函数的情况下编写尾递归函数,或者循环是否需要驻留?

另外,F#std lib中是否有一个函数可以多次运行给定函数,每次都将最后一个输出作为输入?让我说我有一个字符串,我想在字符串上运行一个函数然后再次在结果字符串上运行它等等...

recursion f# tail-recursion tail-call-optimization

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

关于F#面向对象编程

我们在f#中创建类的方式存在这种二分法,这真的困扰我.我可以使用隐式格式或显式格式创建类.但是我想要的一些功能只能用于隐式格式,有些只能用于显式格式.

例如:

  1. 我不能在明确定义的类中使用let inline*(或let单独).

  2. 在隐式定义的类中定义不可变公共字段(不是属性*)的唯一方法(我知道)是val bla : bla语法.

    但这里有一个冗余.因为我最终会得到两个相同的不可变数据副本,一个私有,一个公共(因为在隐式模式下,构造函数参数在整个类存在期间持续存在)

  3. (不太相关)使用属性进行方法重载和字段默认值的需求相当不合适.

无论如何我可以解决这个问题吗?

*出于性能原因

编辑:结果我错了两点(感谢Ganesh Sittampalam和MichaelGG).

  1. 虽然我不能let inline在隐式和显式类定义中使用,但我可以使用member inline得很好,我假设做同样的事情.

  2. 显然,使用最新的F#,不再有任何冗余,因为类体中没有使用的任何参数都是构造函数的本地参数.

  3. 在下一个F#版本中消失.

oop f#

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

是否可以在使用贪婪字符时重新找到最小匹配

免责声明:我不是正则表达专家.

我正在使用Python re模块在许多htm文件上执行正则表达式匹配.其中一种模式是这样的:

<bla><blabla>87765.*</blabla><bla>
Run Code Online (Sandbox Code Playgroud)

我遇到的问题是,不是找到所有(比如说)五次出现的模式,而是只找到一个.因为它将所有出现的事件焊接成一个,使用<bla><blabla>87765第一次出现的</blabla><bla>部分和页面中最后一次出现的部分.

有没有办法告诉重新找到最小的比赛?

python regex

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

可能吗?匹配完全相同数量的开合括号

我不是Regex的专家.我正在尝试创建一个正则表达式,它将匹配完全相同数量的开始和结束括号,但我很难过如何做到这一点.

一个例子:

nothing: important, a b { c {{{ a another {{ nothing }} }}} }
Run Code Online (Sandbox Code Playgroud)

要么:

one { two {{ error, forgot ending brace }}
Run Code Online (Sandbox Code Playgroud)

问题是我不知道我预先会得到多少支撑.在第一个例子中,我需要获取文本{ c {{{ a another {{ nothing }} }}} }.在第二个我需要得到{{ error, forgot ending brace }}.

甚至可以创建一个匹配规则来执行此操作吗?(我正在使用Qt Regex引擎).

regex qt

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