考虑一下
type Foo =
| I of int
| S of string
let test = [ I(5); I(9); I(7)]
Run Code Online (Sandbox Code Playgroud)
它有效,但现在我希望'test'也是Foo类型,并且仍然是我或SEg的列表
let test = L( [ I(5); I(9); I(42) ] ) //works!
let test2 = L( [ I(5); I(9); S("stuff") ] ) //type error
let test3 = L( [ I(5); I(9); L([]) ] ) //type error
Run Code Online (Sandbox Code Playgroud)
我试试..
type Foo =
| I of int
| S of string
| L of 'T list when 'T :> Foo
Run Code Online (Sandbox Code Playgroud)
我知道它显然不起作用.这对我来说是一件很自然的事情.
非常感谢帮助!!
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication
{
class Program
{
static void Main(string[] args)
{
var x = Environment.GetResourceString("test"); //compile-time error
}
}
}
Run Code Online (Sandbox Code Playgroud)
错误是:'System.Environment'不包含'GetResourceString'的定义.
编辑:OP表示他正在使用Compact Framework,v3.5.
我不明白,我的代码出了什么问题?谢谢!
我在选择正确的异常类型时遇到一些麻烦时遇到了一些麻烦(我更喜欢现有的 .NET 异常之一)。
在这种情况下你有什么建议?提前致谢。
编辑:
这是他的背景:
[<ExpectedAttribute()>]
let foo args ... = ...
Run Code Online (Sandbox Code Playgroud)
该函数foo(用户定义的)被传递到运行时引擎。如果自定义属性不存在,运行时必须抛出异常。
我在按位操作上看F#doc:
按位右移运算符.结果是第一个操作数,其位向右移动第二个操作数中的位数.偏离最不重要位置的位不会旋转到最重要的位置.对于无符号类型,最高有效位用零填充.对于有符号类型,最高有效位用1填充.第二个参数的类型是int32.
与C++语言(也可能是C语言)相比,这种设计选择背后的动机是什么,其中MSB用零填充?例如:
int mask = -2147483648 >> 1; // C++ code
Run Code Online (Sandbox Code Playgroud)
其中-2147483648 =
10000000 00000000 00000000 00000000
Run Code Online (Sandbox Code Playgroud)
和掩码等于1073741824
1073741824 =
01000000 00000000 00000000 00000000
Run Code Online (Sandbox Code Playgroud)
现在,如果你在F#(或C#)中编写相同的代码,这确实会填充MSB,你将得到-1073741824.
其中-1073741824 =
11000000 00000000 00000000 00000000
Run Code Online (Sandbox Code Playgroud) 在C#中,我可以:
var n = new Person()
{
FirstName = "John",
LastName = "Smith"
};
Run Code Online (Sandbox Code Playgroud)
我可以在F#中做同样的事情吗?我的意思是,创建一个类并指定一些属性.
有什么区别:
type IFooable =
interface IDisposable
abstract Foo : (unit -> unit)
Run Code Online (Sandbox Code Playgroud)
和
type IFooable =
inherit IDisposable
abstract Foo : (unit -> unit)
Run Code Online (Sandbox Code Playgroud)
?
如果相同,在哪种情况下我应该使用一个而不是另一个?谢谢!
type Foo =
class
inherit Bar
val _stuff : int
new (stuff : int) = {
inherit Bar()
_stuff = stuff
}
end
Run Code Online (Sandbox Code Playgroud)
我想在上面的构造函数中添加此代码:
if (stuff < 0) then raise (ArgumentOutOfRangeException "Stuff must be positive.")
else ()
Run Code Online (Sandbox Code Playgroud)
我怎样才能在F#中实现这一目标?
这有可能吗?在F#或C#中?都?
例如,我想在F#程序中设置一个条件断点,如下所示:
[x] Condition:
myTuple == (3,3)
(o) Is true
(_) Has changed
Run Code Online (Sandbox Code Playgroud)
谢谢.
在我的代码中,我通过引用传递一些结构,声明它们是可变的并使用&符号.问题是,在某些地方,字段已损坏(仅在发布模式下发生),我不知道为什么.
我找到了一个修复,使用ref关键字而不是address-of运算符.我知道您可以自由地交换它们(如果是实例成员参数),但为什么它可以解决我的问题?
这是一个小代码示例,说明了这一点:
[<Struct>]
type MyStruct =
val mutable private i : int
val mutable private f : float
new (a, b) = { i = a; f = b }
member t.I = t.i
member t.F = t.f
type Printer () =
member t.Print(data : MyStruct byref) = printfn "%d %f" data.I data.F
let bar (p : Printer) =
let mutable x = new MyStruct(2, 8.0)
p.Print(&x)
let foo (p : Printer) =
let mutable y = …Run Code Online (Sandbox Code Playgroud) 我正在通过Clang学习LLVM IR,并发现C函数如:
int inc(int x)
{
return x+1;
}
Run Code Online (Sandbox Code Playgroud)
生成此IR(优化已关闭):
define i32 @inc(i32 %x) #0 {
entry:
%x.addr = alloca i32, align 4
store i32 %x, i32* %x.addr, align 4
%0 = load i32, i32* %x.addr, align 4
%add = add nsw i32 %0, 1
ret i32 %add
}
Run Code Online (Sandbox Code Playgroud)
我的问题是确切地知道为什么它首先分配一个本地(x.addr)商店,然后从它加载.
是否有可能与一个监视窗口特定的语法添加CPU寄存器(RAX,EAX,旗帜,等等等等),以便显示像普通变量和印刷在基-10(或十六进制如果十六进制显示是)?
例如:
如果"注册"窗口显示RAX = 00000000027A6468,则将%rax添加到监视将导致:
Name Value Type
%rax 41575528 CPU Register
Run Code Online (Sandbox Code Playgroud)
谢谢 !