我正在研究原型使用文档数据库(目前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) 说我有100个元素的序列.每10个元素我想要一个前10个元素的新列表.在这种情况下,我将得到10个子列表的列表.
Seq.take(10)看起来很有希望,我怎样才能反复调用它来返回列表清单?
在F#中解析html目前还有哪些其他选择?目前有一些正则表达式,但更喜欢Pythons Beautiful Soup http://www.crummy.com/software/BeautifulSoup/之类的东西,或者能够使用类似于F#的jQuery的api.
我已经看过fslex和fparsec,但我不确定是否有其他人已经用这些构建了一些html解析库,或者我必须编写自己的.
我想运行一些异步工作流,然后在打印一些结果之前等待它完成,例如:
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,所以我想在继续之前等待最慢的完成.
使用Expert F#并使用一些使用Async.BuildPrimitive和Async.Spawn的示例,但它们未定义.我使用的是.NET 4.0.
像Ninject这样的api使用流畅的样式apis,例如:
Bind<ISomething>()
.To<Something>()
.WithConstructorArgument("arg1", "somevalue")
.OnActivation(x => x.DoSomething())
Run Code Online (Sandbox Code Playgroud)
当我尝试在F#中格式化这样的代码时,编译器会在方法调用之间的空白处抱怨.
是否可以将方法调用放在单独的行上?我在考虑类似于流水线操作符的操作,但在这种情况下并不完全确定.
如何在F#格式化?
我希望能够观察视图模型中的对象.我有一个简单的例子,没有按预期工作,任何人都可以看到问题?
使用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,然后将其属性绑定到输入,但属性不会更新.