我经常发现自己在foreach循环中执行以下索引计数器混乱,以确定我是否在第一个元素上.有没有一种更优雅的方式在C#中执行此操作,有些类似的东西if(this.foreach.Pass == 1)?
int index = 0;
foreach (var websitePage in websitePages) {
if(index == 0)
classAttributePart = " class=\"first\"";
sb.AppendLine(String.Format("<li" + classAttributePart + ">" +
"<a href=\"{0}\">{1}</a></li>",
websitePage.GetFileName(), websitePage.Title));
index++;
}
Run Code Online (Sandbox Code Playgroud) 如何在R中实现F#的前向管道运算符?操作员可以轻松地链接一系列计算.例如,当你有一个输入data,想调用函数foo和bar顺序,你可以这样写:
data |> foo |> bar
Run Code Online (Sandbox Code Playgroud)
而不是写作bar(foo(data)).好处是您可以避免使用某些括号,并且计算的执行顺序与执行顺序相同(从左到右).在F#中,运算符定义如下:
let (|>) a f = f a
Run Code Online (Sandbox Code Playgroud)
看起来%...%可以用于二元运算符,但是它如何工作?
我可能在这里错过了这条船,但是如果你给XMLProvider的XML没有所有可能的元素,你如何构建一个使用XML Type Provider的可重用工具呢?换句话说,有没有办法使用XSD?我知道我可以尝试从XSD生成示例XML,但我想知道我是否正在接近这个错误.
我正在尝试使用Rx Builder在F#Computation Expression语法中使用Reactive Extension.如何修复它以使它不会破坏堆栈?像下面的Seq示例一样.是否有任何计划提供RxBuilder的实现作为Reactive Extensions的一部分或作为.NET Framework未来版本的一部分?
open System
open System.Linq
open System.Reactive.Linq
type rxBuilder() =
member this.Delay f = Observable.Defer f
member this.Combine (xs: IObservable<_>, ys : IObservable<_>) =
Observable.merge xs ys
member this.Yield x = Observable.Return x
member this.YieldFrom (xs:IObservable<_>) = xs
let rx = rxBuilder()
let rec f x = seq { yield x
yield! f (x + 1) }
let rec g x = rx { yield x
yield! g (x + 1) }
//do f 5 …Run Code Online (Sandbox Code Playgroud) 我正在将一个C#库重写为F#,我需要翻译以下代码
bool success;
instance.GetValue(0x10, out success);
Run Code Online (Sandbox Code Playgroud)
outF#中关键字的等价物是什么?
我正在尝试创建一个框架来处理文件和数据.我正在努力解决的一个领域是如何为框架提供日志记录功能,允许框架在不知道正在使用的日志记录的情况下报告消息.
let testLogger (source:seq<'a>) logger =
logger "Testing..."
let length = source |> Seq.length
logger "Got a length of %d" length
let logger format = Printf.kprintf (printfn "%A: %s" System.DateTime.Now) format
testLogger [1; 2; 3] logger
Run Code Online (Sandbox Code Playgroud)
理想情况下,我希望此代码可以工作,但我无法确定如何传递记录器功能.
假设我有一个功能,它做了一些相当复杂的功能,它是在子功能的帮助下实现的.为了使事情更容易,而不是元组,我想使用一些私有的中间结构来实现这个功能.
我不希望这些结构的声明泄漏到外面.所以我想要这样的东西:
let someComplexFun p =
type SomeRecord = {i:int; x:int; y:int;}
type SomeOtherRecord = {...}
let innerFunctionA (x:SomeRecord) = ...
let innerFunctionB (x:SomeOtherRecord) = ...
...
Run Code Online (Sandbox Code Playgroud)
我尝试过但当然编译器不允许我这样做.我查看了文档,我无法在任何地方看到类型必须在模块级别声明.
例如,在LISP中,它似乎完全合法,例如:
(defun foo (when)
(declare (type (member :now :later) when)) ; Type declaration is illustrative and in this case optional.
(ecase when
(:now (something))
(:later (something-else))))
Run Code Online (Sandbox Code Playgroud)
那么,我错过了什么吗?如果F#完全可以吗?
这里的代码工作正常:
let f x y z = x + y + z
let g x y = f x y
let h x z = z |> f x
Run Code Online (Sandbox Code Playgroud)
所以我可以写表达式"h 1",并且FSI显示:
val it : (int -> int -> int) = <fun:it@110-3>
Run Code Online (Sandbox Code Playgroud)
如果我调用"h 1 2 3",则以正确的顺序应用参数.
但如果最后一个参数具有不同的类型,则情况会有所不同:
let ff x y (z : string) = x + y
let gg x y = ff x y
let hh x (z : string) = z |> ff x
Run Code Online (Sandbox Code Playgroud)
现在最后一个函数hh会导致错误信息:
Script.fsx(119,10):错误FS0001:类型不匹配.期待
string -> …
所以这里的"Funscript"页面有一个样本.现在我已将示例加载到Visual Studio 2012中.我不熟悉Visual Studio .NET,并且最近才学习F#.示例页面中的最后一行是:
do Runtime.Run(components=components, directory="Web")
Run Code Online (Sandbox Code Playgroud)
总是抛出一个错误.事实上,Visual Studio IDE(编译器)似乎无法识别运行时.
如果这是一种像Java这样的语言,那么我会尝试导入一个库,所以我尝试使用System.Runtime,但仍然无法识别Visual Studio IDE,并且该行抛出错误说:
"The namespace or module "Runtime" is not defined.
Run Code Online (Sandbox Code Playgroud)
两个问题
任何人都可以帮助我使用lapack与最新的f#?或者现在不推荐?
我搜索过,只找到http://fdatamining.blogspot.com/但无法FSharp.PowerPack.Math.Providers.dll编译.
编辑:
@Yin,感谢您的博客.在FSharp.PowerPack.Math.Providers.dll从1.9.7.8源编译时,Microsoft.FSharp.Compatibility.permutation使用了几次而无法找到.在你的博客中,据说只是明确地定义它:
type permutation = int –> int.
Run Code Online (Sandbox Code Playgroud)
另外我更换所有Microsoft.FSharp.Compatibility.permutation以Microsoft.FSharp.Math.Permutation得到它编译.还没有测试过.
你能告诉我们svd bug的测试用例吗?
谢谢