小编yan*_*nta的帖子

F#中的存储库模式

我正在研究原型使用文档数据库(目前MongoDB,可能会改变),并发现.NET驱动程序有点痛苦,所以我想我会用Repository模式抽象数据访问.这应该可以很容易地将你正在使用的任何驱动程序(NoRM,mongodb-csharp,simple-mongob)替换为你的杀手f#mongodb驱动程序,它在准备就绪时不会吮吸.

我的问题是关于添加操作.这将对数据库产生一些副作用,因此对All的后续调用将会有所不同.我应该关心吗?在C#传统上我不会,但我觉得在F#我应该.

这是通用存储库接口:

type IRepository<'a> =
    interface
        abstract member All : unit -> seq<'a>

        // Add has a side-effect of modifying the database
        abstract member Add : 'a -> unit
    end
Run Code Online (Sandbox Code Playgroud)

以下是MongoDB实现的外观:

type Repository<'b when 'b : not struct>(server:MongoDB.IMongo,database) =
    interface IRepository<'b> with

        member x.All() =
            // connect and return all

        member x.Add(document:'b) =
            // add and return unit
Run Code Online (Sandbox Code Playgroud)

在整个应用程序中,我将使用IRepository,从而可以轻松更改驱动程序和可能的数据库.

调用All很好,但是添加我希望的是而不是返回单元,返回一个新的存储库实例.就像是:

        // Add has a side-effect of modifying the database
        // but …
Run Code Online (Sandbox Code Playgroud)

.net f#

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

F#将序列拆分为每个第n个元素的子列表

说我有100个元素的序列.每10个元素我想要一个前10个元素的新列表.在这种情况下,我将得到10个子列表的列表.

Seq.take(10)看起来很有希望,我怎样才能反复调用它来返回列表清单?

f#

10
推荐指数
2
解决办法
3250
查看次数

F#html解析

在F#中解析html目前还有哪些其他选择?目前有一些正则表达式,但更喜欢Pythons Beautiful Soup http://www.crummy.com/software/BeautifulSoup/之类的东西,或者能够使用类似于F#的jQuery的api.

我已经看过fslex和fparsec,但我不确定是否有其他人已经用这些构建了一些html解析库,或者我必须编写自己的.

html f# parsing html-parsing

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

如何等待异步完成

我想运行一些异步工作流,然后在打印一些结果之前等待它完成,例如:

let dowork n =
    async {
        do printfn "work %d" n
    }

let creatework() =
    async {
        for x in [1..5] do
            Async.Start(dowork x)
    }

Async.RunSynchronously(creatework())    
printfn "finished"
Run Code Online (Sandbox Code Playgroud)

当我运行它时,我希望所有的dowork调用在打印"完成"之前完成.但是我得到这样的结果:

工作2工作3工作4工作5完成工作1

我尝试从creatework()中删除异步,但在运行异步工作流之前打印"已完成".

在真正的dowork中,程序会执行一些IO,所以我想在继续之前等待最慢的完成.

f# asynchronous

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

Async.BuildPrimitive和Async.Spawn定义在哪里?

使用Expert F#并使用一些使用Async.BuildPrimitive和Async.Spawn的示例,但它们未定义.我使用的是.NET 4.0.

f#

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

在F#中格式化来自C#的流畅/方法链代码

像Ninject这样的api使用流畅的样式apis,例如:

Bind<ISomething>()
.To<Something>()
.WithConstructorArgument("arg1", "somevalue")
.OnActivation(x => x.DoSomething())
Run Code Online (Sandbox Code Playgroud)

当我尝试在F#中格式化这样的代码时,编译器会在方法调用之间的空白处抱怨.

是否可以将方法调用放在单独的行上?我在考虑类似于流水线操作符的操作,但在这种情况下并不完全确定.

如何在F#格式化?

f# c#-to-f#

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

从对象无法更新视图模型

我希望能够观察视图模型中的对象.我有一个简单的例子,没有按预期工作,任何人都可以看到问题?

使用knockout 1.1.1,有2个输入:

<form data-bind="submit: save">
    <input type="text" data-bind="value: deckName" />
    <input type="text" data-bind="value: deck().Name" />
    <button type="submit">Go</button>
</form>
Run Code Online (Sandbox Code Playgroud)

页面加载时,输入将获得默认值,但提交表单时viewModel.deck().Name不会更新,但是viewModel.deckName.

<script type="text/javascript">
    var initialData = {"Name":"test"};

    var viewModel = {
        deck: ko.observable(initialData),
        deckName: initialData.Name,
        save: function() {
            ko.utils.postJson(location.href, { deck: this.deck, deckName: this.deckName });
        }
    };
    ko.applyBindings(viewModel);
</script>
Run Code Online (Sandbox Code Playgroud)

在表格POST上,deck无论输入deckName还是相应的输入值,仍会发送"测试" .

我真正想要的是能够观察一个对象viewModel.deck,然后将其属性绑定到输入,但属性不会更新.

knockout.js

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

标签 统计

f# ×6

.net ×1

asynchronous ×1

c#-to-f# ×1

html ×1

html-parsing ×1

knockout.js ×1

parsing ×1