以下代码段说明了我遇到的错误.即使两个匹配分支返回相同的东西; 我得到错误,"这个表达式应该有类型单位但这里有类型'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) 如果我有一个通用字段的记录,有没有办法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#区分联合是引用类型.如何在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)
我知道上面的内容并不是惯用的F#,但我试图优化我的应用程序的一部分性能,并且分析清楚地表明堆分配(JIT_new)的成本是导致我的性能瓶颈的原因.简单的联合类型是满足我需求的完美数据结构,而不是堆分配的.
我正在使用此代码来计算加泰罗尼亚数字.它给了我正确的值,直到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) 我正在尝试定义一个包含操作符重载的泛型类型的模块,但是单声道编译器似乎忽略了实现文件中的类型.我的界面文件如下:
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) 我正在查看我在培训课程中看到的一个函数,并且无法理解在以下函数末尾使用"()":
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".
我目前正在使用Visual Studio 2015编写F#代码
我正在尝试访问.Net命名空间System.Drawing来制作位图.我从学校获得了一个工作示例项目,该项目绘制位图并每秒更新一次.该文件是扩展名为.fsx的F#脚本文件
问题是我无法访问System.Drawing名称空间并使用相同的代码,如果我将其复制并粘贴到F#源文件中,扩展名为.fs.
Visual Studio的intellisence甚至没有显示.Drawing命名空间.
我试过谷歌搜索,但我不知道该搜索什么.
当你想要返回一个闭包时,我理解嵌套函数的好处.但是当一个函数从未在它定义的函数之外使用时,是否需要保持嵌套的成本?
考虑:
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签名包含内部或私人类型,则考虑将所有内容公开并且参数列表爆炸.
任何重要的差异?
给定包含伯努利分布均值的1D张量,如何用给定的方法对相应的1D张量进行采样?
TensorFlow似乎只有实现random_normal和random_uniform功能.我可以使用复杂的东西:
tf.ceil(tf.sub(tf.random_uniform((1, means.get_shape()[0])),means))
Run Code Online (Sandbox Code Playgroud)
但该ceil函数没有在TensorFlow中定义的渐变.
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#的类型系统使编写更多通用程序变得非常困难.
任何提示?