小编gra*_*bot的帖子

序列的F#array_chunk

我在制作序列时遇到了一些麻烦.基本上我需要将序列切割成一系列数组.Seq.windowed几乎做到了,但我不想要重复的元素.

我可以通过首先将所有内容读入数组来获得我想要的内容,但我宁愿使用序列.

let array_chunk s (a:int[]) =
    Array.init (a.Length / s) (fun i -> Array.sub a (i * s) s)

someSequence |> Seq.to_array |> array_chunk 5
Run Code Online (Sandbox Code Playgroud)

arrays f# sequence chunking

6
推荐指数
3
解决办法
1837
查看次数

F#库在使用时应该表现得像C#

我正在用F#开发一个库,供另一个使用C#的团队使用.知道其他团队希望这个库的行为与其他任何C#库一样,我应该注意什么?

例如,如果我使用Options类型,当我向C#公开时,我需要将它们转换为null.其他一些可能的过渡区域可能是计算表达式,FastFunc,事件和命名问题.

c# f#

6
推荐指数
2
解决办法
294
查看次数

在PostgreSQL 9.0中优化转义JSON

我目前在PostgreSQL中使用这个JSON转义函数作为未来原生JSON支持的代表.虽然它有效,但它也限制了我们的系统性能.我该如何进行优化呢?也许某种查找数组?

CREATE OR REPLACE FUNCTION escape_json(i_text TEXT) 
RETURNS TEXT AS
$body$                                                  
DECLARE
  idx INTEGER;
  text_len INTEGER;   
  cur_char_unicode INTEGER;
  rtn_value TEXT := i_text;
BEGIN
  -- $Rev: $ --
  text_len = LENGTH(rtn_value);
  idx = 1; 

  WHILE (idx <= text_len) LOOP
    cur_char_unicode = ASCII(SUBSTR(rtn_value, idx, 1));

    IF cur_char_unicode > 255 THEN
      rtn_value = OVERLAY(rtn_value PLACING (E'\\u' || LPAD(UPPER(TO_HEX(cur_char_unicode)),4,'0')) FROM idx FOR 1);
      idx = idx + 5;
      text_len = text_len + 5;
    ELSE
      /* is the current character one of the following: " …
Run Code Online (Sandbox Code Playgroud)

postgresql json query-optimization

5
推荐指数
2
解决办法
5162
查看次数

F#将Array2转换为列表

我还是功能编程的新手,所以如果我无法弄清楚如何做某些事情,我会回归到程序风格.我找到了一种方法来转换到列表,但我仍然想知道如何.

这是我尝试将二维数组转换为列表.

let board = Array2.init 10 20 (fun i j -> pull(i, j))

let mutable pieces = []

board
|> Array2.mapi (fun i j a -> transform(i, j, a))
|> Array2.iter (fun a -> (pieces <- a :: pieces))
Run Code Online (Sandbox Code Playgroud)

f# list

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

F#活动模式作为非静态成员

我不确定是否允许非静态公共成员活动模式,但您可以在没有编译器抱怨的情况下定义它们.如果允许它们与一个匹配的语法是什么?编译器在FooBar2.doSomething中为Foo提供了类型不匹配.期待一个'a -> Choice<'b,'c>给定的'a -> 'd -> Choice<unit,unit>

// No error in this class, static works great
type FooBar() = 
    static member (|Foo|Bar|) (x, y) =
        match x = y with
        | true -> Foo
        | false -> Bar

    member x.doSomething y =
        match x, y with
        | Foo -> ()
        | Bar -> ()

type FooBar2() = 
    member x.(|Foo|Bar|) y =
        match x = y with
        | true -> Foo
        | false -> Bar

    // compiler error …
Run Code Online (Sandbox Code Playgroud)

f# member active-pattern

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

使用F#的类型成员中的元组

我有一个简单的问题.为什么这不起作用?

type Test1() =
  member o.toTuple = 1.,2.,3.

type Test2() =
  member o.test (x: float, y: float, z: float) = printfn "test"
  member o.test (x: Test1) = o.test x.toTuple
Run Code Online (Sandbox Code Playgroud)

错误是:

类型约束不匹配.float*float*float类型与类型Test1不兼容类型'float*float*float'与类型'Test1'不兼容

'float*float*float'类型与'Test1'类型不兼容

f# types tuples member

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

F#将活动模式匹配为扩展元组

我在diff中使用红色波形在diff中得到以下错误.
Type mismatch. Expecting a Range -> Choice but given a Range * Range -> Choice

是否有某种类型的注释我可以添加到SubSet匹配,所以我不必使用fst和snd?如果没有,是否有意支持这种语法?

type Range = {min : int64; max : int64}

let (|Before|After|BeforeOverlap|AfterOverlap|SuperSet|SubSet|) (x, y) = 
    if x.min > y.max then After
    elif x.min >= y.min then
        if x.max <= y.max then SubSet
        else AfterOverlap
    elif x.max < y.min then Before
    elif x.max <= y.max then BeforeOverlap
    else SuperSet

let useOldx x xe ye = ()

let diff (xe:IEnumerator<Range>) (ye:IEnumerator<Range>) =
    match xe.Current, ye.Current with …
Run Code Online (Sandbox Code Playgroud)

f# tuples match active-pattern

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