我有一个SBT多项目,其中一些项目彼此依赖.像这样:
lazy val coreProject: Project = Project(
id = "core-project",
base = file("./core-project"),
// other stuff
))
lazy val extensions: Project = Project(
id = "extensions",
base = file("./extensions"),
dependencies = Seq(coreProject)
)
Run Code Online (Sandbox Code Playgroud)
现在我在test-folder的'core'项目中有一些测试代码.还有模拟和测试实用程序之类的东西.现在我想在扩展的测试中使用这些测试实用程序.对于生产代码,这是有效的,因为我已经声明了依赖.然而,似乎依赖性不适用于测试.当我运行测试时,我得到了缺少类的编译错误.这些类来自核心项目中的测试代码.
如何告诉sbt依赖项还应该包含测试范围的测试代码?这样我可以在'exension'项目的测试代码中重用我的模拟?
我使用Matlab作为原型工具学习了机器学习课程.由于我沉迷于F#,我想继续我在F#的机器学习研究.
我可能希望将F#用于原型设计和生产,因此机器学习框架将是一个很好的开始.否则,我可以从一组库开始:
最重要的资源(对我而言)是关于机器学习的书籍,博客文章和在线课程,使用函数式编程语言(F#/ OCaml/Haskell ......).
任何人都可以建议这些资源吗?谢谢.
编辑:
这是基于以下答案的摘要:
机器学习框架:
相关图书馆:
Math.NET Numerics:内部使用英特尔MKL和AMD ACML进行矩阵运算并支持统计功能.
Microsoft Solver Foundation:线性编程和优化任务的良好框架.
FSharpChart:F#中一个不错的数据可视化库.
阅读清单:
任何其他指针或建议也欢迎.
假设我有以下单一案例歧视联盟:
type OrderId = OrderId of string
Run Code Online (Sandbox Code Playgroud)
在某些时候我需要实际的字符串.我发现它的提取方式是:
let id = match orderId with OrderId x -> x
Run Code Online (Sandbox Code Playgroud)
这样做有更简洁的方法吗?
我知道我的使用是一个特殊的情况,并且匹配是有意义的,以确保你已经涵盖了可能性,只是想知道是否有办法做一些事情,如:
let OrderId id = orderId
Run Code Online (Sandbox Code Playgroud) 功能编程具有不可变的数据结构,并且没有副作用,这些本质上适用于并行编程.我研究了如何在函数式语言中利用多核计算,并针对某些数值应用程序设定生产代码.
F#背后有微软,它的并行结构如PLINQ,TPL,Async Workflow已被充分记录并显示出一些潜力.然而,关于Haskell中的并行性的研究目前非常活跃,并且它具有许多F#尚未支持的优秀特性:
我的问题是我应该选择哪种语言进行功能并行?如果选择了F#,是否有任何指针可以构建他们目前在Haskell中拥有的内容?
更新:
我选择了Simon的答案,因为它带来了关于垃圾收集器,内存分配和缓存未命中的一些很好的讨论.我会坚持使用F#,我认为这些答案对我学习功能并行是有帮助的.
我正在研究F#中的多核并行性.我必须承认,不可变性确实有助于编写正确的并行实现.但是,当核心数量增长时,很难实现良好的加速和良好的可扩展性.例如,我使用快速排序算法的经验是,许多尝试以纯粹功能的方式实现并行快速排序并使用List或Array作为表示失败.对这些实现进行分析表明,与顺序版本相比,缓存未命中数量显着增加.但是,如果使用阵列内部的突变实现并行快速排序,则可以获得良好的加速.因此,我认为突变可能是优化多核并行性的一种很好的实践.
我认为缓存局部性是功能语言中多核并行的一大障碍.函数式编程涉及创建许多短期对象; 破坏这些对象可能会破坏CPU缓存的一致性.我已经看到很多建议如何改进命令式语言中的缓存局部性,例如,这里和这里.但是我不清楚如何在函数式编程中完成它们,特别是对于经常出现的递归数据结构(如树等).
是否有任何技术可以改进不纯函数语言(特别是F#)中的缓存局部性?任何建议或代码示例都非常受欢迎.
parallel-processing f# asynchronous functional-programming multicore
我刚读完一本关于scala的书.令我震惊的是,整本书中的每一个例子都是某种形式的数字.
像许多程序员一样,我使用的唯一数学来自离散和组合数学,而且通常不是数学我以明确的方式编程.我真的错过了常规oo算法的功能替代/补充的一些引人注目的例子.
什么是函数式编程的非数字用例?
扩展计算表达式的意思是使用CustomOperation属性定义的自定义关键字的计算表达式.
在阅读扩展计算表达式时,我遇到了@kvb非常酷的IL DSL:
let il = ILBuilder()
// will return 42 when called
// val fortyTwoFn : (unit -> int)
let fortyTwoFn =
il {
ldc_i4 6
ldc_i4_0
ldc_i4 7
add
mul
ret
}
Run Code Online (Sandbox Code Playgroud)
我想知道如何在不使用for..in..do构造的情况下构成操作.我的直觉是它从x.Zero成员开始,但我没有找到任何参考来验证.
如果上面的例子太技术性,那么这里是类似的DSL,其中列出了幻灯片的组件而没有for..in..do:
page {
title "Happy New Year F# community"
item "May F# continue to shine as it did in 2012"
code @"…"
button (…)
} |> SlideShow.show
Run Code Online (Sandbox Code Playgroud)
我有几个密切相关的问题:
For成员的情况下定义或使用扩展计算表达式(即提供一个小的完整示例)?如果他们不再是monad我不担心,我对他们开发DSL感兴趣.let!和 …我已经读完了关于F#的书籍,我已经完成了本书中的大部分练习,这些练习都是基本的.现在我正在寻找更高级的练习来提高我的语言和功能编程概念.
是否有一个地方或一本书,我可以通过特别设计的练习练习F#来学习语言功能?现在我只能找到介绍性的东西或一般的编程问题网站(例如Project Euler).
我的目标是学习如何以功能方式思考并习惯模式匹配,部分应用函数,monads/workflows,尾递归等等.我想学习如何使用功能构造解决问题.
我也对任何为其他函数式编程语言(如Haskell)设计的好练习感兴趣.
我必须枚举集合的成员并创建一个具有成员特定属性的数组:
let ops: int array = [| for x in app.Operations ->
let op= x : IAzOperation
op.OperationID |]
Run Code Online (Sandbox Code Playgroud)
这app.Operations是IAzOperation的集合,但在枚举时,将每个成员返回为Obj.所以我想输入每个成员并访问该属性.但不确定如何进行类型转换.如果我按照我在这里提到的方式进行类型转换,它会给我错误:
This espression was expected to have type IAzOPeration but here has type obj.
Run Code Online (Sandbox Code Playgroud)
我在这里错过了什么?
F#3.0 beta包含一个查询{}计算表达式,包含大量新关键字.
如何在计算构建器中定义自己的关键字?