为什么下面的代码给我一个不完整的模式匹配警告和运行时异常.
type Left =
| L1 of int
| L2 of int
type Right =
| R1 of int
| R2 of int
type Directions =
| LeftDir of Left
| RightDir of Right
let unpack (LeftDir (L1 i)) = i
let x = unpack (LeftDir (L1 10))
let y = unpack (LeftDir (L2 20))
Run Code Online (Sandbox Code Playgroud)
显然答案是因为IT是一个不完整的模式匹配;-)
但是为什么F#不够聪明(或者F#语言规范的编写者)知道unpack
只期待一个LeftDir containing a L1
?为什么需要完整的模式匹配?
以下是我在标准库中找到的内容吗?
split transformer1 ([], []) [("Foo", 1); ("Bar", 2); ("FooBar", 3)];;
> val it : string list * int list = (["FooBar"; "Bar"; "Foo"], [3; 2; 1])
Run Code Online (Sandbox Code Playgroud)
这是我的实施
let split transformer defval stream =
let rec split' s acc =
match s with
| [] -> acc
| x::xs -> split' xs (transformer x acc)
split' stream defval
let transformer1 (key, item) (akey, aitem) = (key::akey, item::aitem)
let transformer2 (key, item) (akey) = (key::akey)
let transformer3 (key, item) (a1, a2, …
Run Code Online (Sandbox Code Playgroud) 假设我有以下通用接口
type IStorageX<'a, 'b> =
abstract Make: 'a -> 'b
abstract From: 'c -> 'b
Run Code Online (Sandbox Code Playgroud)
以下2种类型
type SomeInput<'a> = {value : 'a}
type SomeThing = {value: string}
with interface IStorageX<int, SomeThing> with
member this.Make x = {value = sprintf "%A" x}
member this.From (x:SomeInput<'a>) = {value = sprintf "%A" x.value}
Run Code Online (Sandbox Code Playgroud)
如何使F#理解member From
应该允许任何类型的输入(只要它SomeInput
)?
我在某种程度上试图尝试的是
type IStorageX<'a, 'b, 'c> =
abstract Make: 'a -> 'b
abstract From: 'c -> 'b
type SomeThing = {value: string}
with interface IStorageX<int, …
Run Code Online (Sandbox Code Playgroud) 我想为我的泛型函数添加2个约束.构造函数约束和成员约束.
let somefn<'T when 'T : (new : unit -> 'T) and 'T : (member Add : 'T -> unit)> v = new 'T()
Run Code Online (Sandbox Code Playgroud)
但是我收到以下错误:
/stdin(32,5): error FS0670: This code is not sufficiently generic.
The type variable ^T when ^T : (new : unit -> ^T) and
^T : (member Add : ^T * ^T -> unit)
could not be generalized because it would escape its scope.
Run Code Online (Sandbox Code Playgroud)
我真的不明白这个错误信息.
仅当我将定义更改为:
let inline somefn<'T when 'T : (new : unit -> 'T) …
Run Code Online (Sandbox Code Playgroud) 我有一些问题,通过以下代码理解一般约束.View是Xamarin框架中的基类(但这并不重要)
type GridCoordinates = (View * int * int * int * int)
type GridRecord = { children: GridCoordinates list}
Run Code Online (Sandbox Code Playgroud)
鉴于此代码,我在这里得到一个编译错误
let x = { children = [(new BoxView( Color = Color.Green ), 0, 3, 0, 1)] }
^^^^^^^^^^^
Expression expected to have type View
Run Code Online (Sandbox Code Playgroud)
现在BoxView的类型为View - 嗯.所以我想我会在其中添加一些通用约束
type GridCoordinates<'T when 'T :> View> = ('T * int * int * int * int)
type GridRecord = { children: GridCoordinates<View> list}
Run Code Online (Sandbox Code Playgroud)
但是这仍然给了我同样的错误.所以我也向GridRecord添加了一个constrait
type GridCoordinates<'T when 'T :> View> = ('T …
Run Code Online (Sandbox Code Playgroud) 我老老实实地对此感到困惑.为什么不起作用 - 我是不是明确地说这'T
确实是一个View
?
let foo<'T when 'T :> View> (v:'T):View = v
error FS0001: This expression was expected to have type View
but here has type 'T
Run Code Online (Sandbox Code Playgroud) 给出以下 JSON
{
"Families": [
{ "Name": "Smith",
"Children": [
{ "Name": "Bob",
"Pets": [
{ "Name": "Oscar", "Type": "Cat"},
{ "Name": "Otto", "Type": "Dog"}
]
},
{ "Name": "Brittney",
"Pets": [
{ "Name": "Isolde", "Type": "Dog"},
{ "Name": "Ignatz", "Type": "Turtle"}
]
}
]
},
{ "Name": "Miller",
"Children": [
{ "Name": "Alex",
"Pets": [
{ "Name": "Elvis", "Type": "Horse"}
]
}
]
}
]
}
Run Code Online (Sandbox Code Playgroud)
A)我想创建一个产生以下结构的查询
[
{ "FamilyName": "Smith",
"KidName": "Bob",
"Petname": "Oscar"
},
{ "FamilyName": "Smith", …
Run Code Online (Sandbox Code Playgroud)