小编rob*_*kuz的帖子

参数的不完全模式匹配

为什么下面的代码给我一个不完整的模式匹配警告和运行时异常.

 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?为什么需要完整的模式匹配?

f# pattern-matching

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

是否有列表模块功能,就像使用Transformer解压缩一样

以下是我在标准库中找到的内容吗?

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)

f# standard-library

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

如何在接口实现中保留未实现的泛型类型参数?

假设我有以下通用接口

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)

generics f#

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

向通用函数定义添加多个约束(为什么我必须内联)?

我想为我的泛型函数添加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)

generics f#

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

记录类型的通用约束

我有一些问题,通过以下代码理解一般约束.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)

generics f#

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

Upcasting和泛型

我老老实实地对此感到困惑.为什么不起作用 - 我是不是明确地说这'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)

generics f#

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

如何使用 Cosmos DB 查询嵌套数组

给出以下 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)

azure-cosmosdb

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