小编Guy*_*der的帖子

令人困惑的F#编译器消息

以下代码段说明了我遇到的错误.即使两个匹配分支返回相同的东西; 我得到错误,"这个表达式应该有类型单位但这里有类型'a - > unit"我不知道编译器想要什么...

open System.IO 

let FileContent contents =  
  match contents with  
  | "" -> None  
  | c -> Some(c)  

let WriteSomething (contents:string) =  
  let writer = new StreamWriter("")  
  writer.Write( contents ) |> ignore  

let DoStuffWithFileContents =  
  let reader = new StreamReader( "" )  
  let stuff = reader.ReadToEnd()  
  match stuff |> FileContent with  
  | Some(c) -> WriteSomething c  
               |> ignore  
  | None -> ignore  // <- error on "ignore"
Run Code Online (Sandbox Code Playgroud)

f# unit-type

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

Generics记录"with"语法

如果我有一个通用字段的记录,有没有办法with在更改泛型时模仿方便的语法?

即如果我有

type User<'photo> = // 'photo can be Bitmap or Url
  { first: string; last: string; address: string; phone: string; photo: 'photo }
Run Code Online (Sandbox Code Playgroud)

我希望能够写出类似的东西

let loadUser(user: User<Url>): User<Bitmap> =
  { user with
    photo = download user.photo }
Run Code Online (Sandbox Code Playgroud)

但看起来我必须写这个.

let loadUser(user: User<Url>): User<Bitmap> =
  { first = user.first
    last = user.last
    address = user.address
    phone = user.phone
    photo = download user.photo }
Run Code Online (Sandbox Code Playgroud)

有没有办法获得第一个语法?

f# functor

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

如何在F#中创建一个值类型的联合类型?

普通F#区分联合是引用类型.如何在F#中创建一个简单的(非递归的,只有值类型的字段)联合类型,它是一个值类型?

根据一些互联网搜索,我当前(非工作)的尝试看起来如下:

[<StructLayout(LayoutKind.Explicit)>]
type Float =
    [<DefaultValue>] [<FieldOffset 0>] val mutable Val1 : float
    [<DefaultValue>] [<FieldOffset 0>] val mutable Int1 : int
    new (a:float) = {Val1 = a}    
Run Code Online (Sandbox Code Playgroud)

以下博客文章显示通过C#显示可能的内容

我知道上面的内容并不是惯用的F#,但我试图优化我的应用程序的一部分性能,并且分析清楚地表明堆分配(JIT_new)的成本是导致我的性能瓶颈的原因.简单的联合类型是满足我需求的完美数据结构,而不是堆分配的.

.net c# f# pointers discriminated-union

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

计算加泰罗尼亚数

我正在使用此代码来计算加泰罗尼亚数字.它给了我正确的值,直到n = 6,然后它给了我错误的值.我用计算器手动检查了.对于Ex:当n = 5时,加泰罗尼亚数字是42,这是正确的,但是当n = 7时,它给我6这是完全错误的,因为答案应该是429.我只是想弄清楚什么是错的.有谁可以帮助我吗?

static void Main(string[] args)
{
    int i, n, fact, fact1, fact2, CatalanN;
    Console.WriteLine("Enter a Number (n>=0)");

    n = Convert.ToInt32(Console.ReadLine());
    fact = n;

    for (i = n - 1; i > 0; i--)
    {
        fact = fact * i;
    }
    Console.WriteLine("" + fact);
    Console.ReadLine();

    fact1 = 2*n;

    for (i = 2*n - 1; i > 0; i--)
    {
        fact1 = fact1 * i;
    }
    Console.WriteLine("" + fact1);
    Console.ReadLine();

    fact2 = n+1;

    for (i = …
Run Code Online (Sandbox Code Playgroud)

c# catalan

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

F#重载泛型类型的运算符

我正在尝试定义一个包含操作符重载的泛型类型的模块,但是单声道编译器似乎忽略了实现文件中的类型.我的界面文件如下:

module Vector
[<Sealed>]
type Vector<'a> =
  static member ( +. ) : Vector<'a> * Vector<'a> -> Vector<'a>
val make : 'a * 'a -> Vector<'a>
val coord : Vector<'a> -> 'a * 'a
Run Code Online (Sandbox Code Playgroud)

我的实施是

module Vector
type Vector<'a> =
  | V of 'a * 'a
  static member ( +. ) (V(x1,y1), V(x2,y2)) = V(x1+x2, y1+y2)
let make (x, y) = V(x, y)
let coord (V(x, y)) = (x, y)
Run Code Online (Sandbox Code Playgroud)

当我编译时,我得到:

fsharpc -a VectorParam.fsi VectorParam.fs
F# Compiler for F# 3.1 …
Run Code Online (Sandbox Code Playgroud)

generics mono f# inline operator-overloading

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

为什么函数签名具有跟随其他参数的单位参数?

我正在查看我在培训课程中看到的一个函数,并且无法理解在以下函数末尾使用"()":

let acclock (start:DateTimeOffset) rate () =
    let now = DateTime.Now
    let elapsed = now - start
    start.AddTicks (elapsed.Ticks * rate)
Run Code Online (Sandbox Code Playgroud)

为什么函数签名在其签名的其他参数的末尾有一个单位参数?

因此,我认为单位参数意味着没有参数或返回类型,类似于"void".

f# unit-type

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

如何在F#源文件(fs)中引用system.drawing.它适用于脚本文件(fsx)

我目前正在使用Visual Studio 2015编写F#代码

我正在尝试访问.Net命名空间System.Drawing来制作位图.我从学校获得了一个工作示例项目,该项目绘制位图并每秒更新一次.该文件是扩展名为.fsx的F#脚本文件

问题是我无法访问System.Drawing名称空间并使用相同的代码,如果我将其复制并粘贴到F#源文件中,扩展名为.fs.

Visual Studio的intellisence甚至没有显示.Drawing命名空间.

我试过谷歌搜索,但我不知道该搜索什么.

dll f# bitmap visual-studio-2015

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

当嵌套是可选的时,嵌套f#函数与不嵌套它们有何不同?

当你想要返回一个闭包时,我理解嵌套函数的好处.但是当一个函数从未在它定义的函数之外使用时,是否需要保持嵌套的成本?

考虑:

let private validate number = 
    number > 100

let validateAndPrint (i : int) = 
    printfn "%i Greater than 100: %s" i ((validate i).ToString())
Run Code Online (Sandbox Code Playgroud)

与:

let validateAndPrint (i : int) = 
    let validate number = 
        number > 100
    printfn "%i Greater than 100: %s" i ((validate i).ToString())
Run Code Online (Sandbox Code Playgroud)

这里的问题通常是当我有一些这些内部函数时,我只需要根据执行路径调用其中一个函数(通常不会禁止将这些函数保密或嵌套并测试排列).

validateAndPrint 也可以重写更多tdd-friendly以接受验证功能:

let validateAndPrint validate i = ...
Run Code Online (Sandbox Code Playgroud)

..但如果validation签名包含内部或私人类型,则考虑将所有内容公开并且参数列表爆炸.

任何重要的差异?

f# inline

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

在TensorFlow中采样Bernoulli随机变量

给定包含伯努利分布均值的1D张量,如何用给定的方法对相应的1D张量进行采样?

TensorFlow似乎只有实现random_normalrandom_uniform功能.我可以使用复杂的东西:

tf.ceil(tf.sub(tf.random_uniform((1, means.get_shape()[0])),means))
Run Code Online (Sandbox Code Playgroud)

但该ceil函数没有在TensorFlow中定义的渐变.

tensorflow

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

为什么F#没有列表元素的类型推断?

I was trying to put both int and float into a list construction:

> let l2=[1;2.0];;

  let l2=[1;2.0];;
  ----------^^^

stdin(50,11): error FS0001: This expression was expected to have type
    int
but here has type
    float
>
Run Code Online (Sandbox Code Playgroud)

好吧,如果我在Haskell中写l3 = [1,2.0],它可以构建列表以包含所有"小数"元素.为什么F#不支持自动类型推断?F#基于.net,Int和Float都是Object类型,对吧?为什么Int和Float无法放入一个列表中,而某些元素会自动进行类型提升或转换?似乎F#的类型系统使编写更多通用程序变得非常困难.

任何提示?

f# inference inline list

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