小编Ove*_*ive的帖子

错误FS0001,此函数应具有类型byref <int>

我有一个做了一个简单的函数,它包装签名的共同F#的功能'a -> 'b -> 'c option更多的"C#兼容"功能:'a -> b -> byref<'c> -> bool.但不知何故,当我尝试在类中包装这样的方法时,我收到错误FS0001,我找不到错误.

代码如下

open System
open System.Runtime.InteropServices

// Given a function, f: 'a -> 'b -> 'c option returns
// A new function g: 'a -> 'b -> byref<'c> -> bool
let wrapOptionF f a b (g:byref<'c>) =
    match f a b with
    | Some v ->
        do g <- v
        true
    | None -> 
        false

let tryDivide (a:int) (b:int) =
    match Math.DivRem(a,b) with
    | v, …
Run Code Online (Sandbox Code Playgroud)

f#

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

生成一组无限的数字

我正在尝试制作一个素数生成器,它应该能够返回一个素数序列,直到第n个数.现在我认为除了我当前的解决方案之外,还应该有一种更优雅的方式来处理序列,感觉有点冗长,我不得不使用mutables.

0
|> Seq.unfold (fun x -> if isPrime x 
                          then Some(x, x + 1) 
                         else 
                          let mutable y = x
                          while isPrime y <> true do
                           y <- y + 1
                          Some(y, y + 1)) 
|> Seq.take(n)
Run Code Online (Sandbox Code Playgroud)

primes f# lazy-sequences

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

F#在do块中包装语句

我有一个关于在F#中使用do块的约定的问题.在使用.NET库类和其他.NET代码时,首先会出现这种情况.

让我给你举个例子.

1.使用do块包含语句:

let drawHelloName (width:int, height:int) name = 
    let bmp = new Bitmap(width, height)
    use fnt = new Font("Arial", 12.0f)
    use gr = Graphics.FromImage(bmp)
    do
        gr.Clear(Color.White)
        gr.DrawString(name, fnt, Brushes.Black, PointF(10.0f, 10.0f))
    bmp
Run Code Online (Sandbox Code Playgroud)

2.没有阻止:

let drawHelloName (width:int, height:int) name = 
    let bmp = new Bitmap(width, height)
    use fnt = new Font("Arial", 12.0f)
    use gr = Graphics.FromImage(bmp)
    gr.Clear(Color.White)
    gr.DrawString(name, fnt, Brushes.Black, PointF(10.0f, 10.0f))
    bmp
Run Code Online (Sandbox Code Playgroud)

现在在我看来,我认为例子1更清晰,更符合F#的观点和风格.由于在函数式编程中处理语句并不是"自然",因此我们将语句显式地包装在do块中以表明它们是副作用.但我想知道,关于这个的惯例是什么?

f# functional-programming conventions statements

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

F# 转换 int

这是一件非常微不足道的事情,但我真的很难让它发挥作用。我想转换sqrt nwhere nis 类型的结果,int64最后将它传递给一个接受 an 的函数,int但我真的很难找到一个像样的解决方案,这是我想出的方法,但这是可怕的,我可以'不相信在例如 C# 中如此微不足道的事情在 F# 中应该如此困难。

n 
|> float 
|> sqrt 
|> int 
|> function
Run Code Online (Sandbox Code Playgroud)

f# casting type-safety

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

为什么枚举式联合在C#中被视为一个类?

我意识到受歧视的工会不一定和enums一样.但在这些类型的DU的情况下:

type Colors = Red | Green | Blue
Run Code Online (Sandbox Code Playgroud)

它们被视为一个类Colors,其中每种颜色都是一个引用Colors该类实例的只读属性.

对于这些类型的可以比作枚举的DU,为什么它们不被视为C#中的枚举?

c# clr enums f# discriminated-union

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

在方法重载之间共享变量?

我是一个真正的新手程序员,我正试图做一个共享变量的重载.基本上我想要做的是有一个带有一个重载的方法,它将整数值写入其中的变量,另一个重载只返回该值.

现在我尝试这样做:

private int GetQID(int qID)
    {
        int ID = qID;
    }    
private int GetQID()
    {
        return ID;
    }
Run Code Online (Sandbox Code Playgroud)

遗憾的是,这不起作用,因为第二个重载不能访问第一个重载的"ID"变量.有没有办法不诉诸全局变量,我可以这样做吗?

c# methods

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

用点分隔符格式化浮点数

我正在编写一个 csv 转换器来将交易的文本文档转换为 csv 文档,但我遇到了一个小问题..

    foreach (var transaction in transactions)
    {
        output.Append(
            string.Format("{0:dd/MM/yy},{1},{2},{3},{4:0.##},{5}", 
            transaction.Date, 
            transaction.Payee, 
            transaction.Category,
            transaction.Memo,
            transaction.Outflow,
            transaction.Inflow));
        output.AppendLine();
    }
Run Code Online (Sandbox Code Playgroud)

这一切都很好,我遇到的小问题是该Outflow属性是一个浮点数,并且我的语言环境使用逗号作为十进制分隔符,这在CSV 中显然是一个很大的问题,所以不是让我们说 10.50 它会输出 10,50,有什么简单的方法可以解决这个问题吗?

c# csv locale

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

F#中这两个函数有什么区别吗?

在F#中,编写这样的函数之间有什么区别......

let add x y = x + y

或这个...

let add = fun x y -> x + y

当我看到IL时,它们似乎产生完全相同类型的IL.他们肯定"似乎"做同样的事情,但从概念上来说,我觉得它们是不同的,第一个是函数声明,第二个是值"声明",它是一个函数.

此外,如果我们做一个稍微详细的例子..

这个...

let add x = 
    let rnd = System.Random()
    let rnd = rnd.Next(100)
    x + rnd
Run Code Online (Sandbox Code Playgroud)

......与此相比

let add = 
    let rnd = System.Random()
    let rnd = rnd.Next(100) 
    (fun x -> x + rnd)
Run Code Online (Sandbox Code Playgroud)

这些示例遵循与前两个相同的原则,但这两个示例将完全不同于彼此.

lambda f# closures function

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

删除枚举标志

我对有点删除枚举标志感到有点困惑.

让我举一个例子,假设我们有一个看起来像这样的枚举

[Flags]
enum Letter 
{
    A = 1, // 1
    B = 2, // 10
    C = 4  // 100
}
Run Code Online (Sandbox Code Playgroud)

现在,如果我想让变量保持Letter.AB我可以做的标志foo = Letter.A | Letter.B.现在这对我来说很有意义,我可以计算一下它会有意义:

   01
OR 10
 = 11 = 3 = 1 + 2 = A + B = AB
Run Code Online (Sandbox Code Playgroud)

当谈到删除标志时,我很困惑,直觉上我想要做的是使用XOR运算符这样做,如下所示:

bar = Letter.A | Letter.B | Letter.C // Set bar to ABC
// Now let's remove everything but Letter.C
bar = bar ^ (Letter.A | Letter.B)
Run Code Online (Sandbox Code Playgroud)

手动计算应该产生:

    111
XOR …
Run Code Online (Sandbox Code Playgroud)

c# enums bit-manipulation

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