考虑代码两个片段,简单地订购串C#并F#分别为:
C#:
var strings = new[] { "Tea and Coffee", "Telephone", "TV" };
var orderedStrings = strings.OrderBy(s => s).ToArray();
Run Code Online (Sandbox Code Playgroud)
F#:
let strings = [| "Tea and Coffee"; "Telephone"; "TV" |]
let orderedStrings =
strings
|> Seq.sortBy (fun s -> s)
|> Seq.toArray
Run Code Online (Sandbox Code Playgroud)
这两个代码片段返回不同的结果:
在我的具体情况下,我需要关联这两种语言之间的排序逻辑(一种是生产代码,一种是测试断言的一部分).这提出了几个问题:
编辑
在回答几个探测性评论时,运行下面的片段可以更多地了解这种排序差异的确切性质:
F#:
let strings = [| "UV"; "Uv"; "uV"; "uv"; "Tv"; "TV"; "tv"; "tV" |]
let orderedStrings =
strings
|> Seq.sortBy (fun s -> s)
|> …Run Code Online (Sandbox Code Playgroud) 我目前正在使用msbuild构建多个项目.我对由.targets文件处理的构建进行了一个小的自定义.一种解决方案是添加代码段
<Import Project="MyTargets.targets"/>
Run Code Online (Sandbox Code Playgroud)
到每个项目文件.但是,理想情况下我不想触摸项目文件,并能够将此信息作为参数传递给msbuild.这样我就可以轻松控制是否从命令行运行此自定义,而且我不必触摸现有的项目文件.
这可能吗?
考虑下面的F#片段:
type MyType = {
CrucialProperty: int
OptionalProperty: string option
}
let first = { CrucialProperty = 500; OptionalProperty = Some("Hello")}
let second = { CrucialProperty = 500; OptionalProperty = Some(null)}
let third = { CrucialProperty = 500; OptionalProperty = None}
Run Code Online (Sandbox Code Playgroud)
我希望使用JSON.NET对此类型进行序列化,因此我分别针对上述情况获取以下字符串:
{"CrucialProperty":500,"OptionalProperty":"Hello"}
{"CrucialProperty":500,"OptionalProperty":null}
{"CrucialProperty":500}
Run Code Online (Sandbox Code Playgroud)
从本质上讲,问题归结为能够根据该属性的值在序列化输出中包含/排除属性.
我已经设法在那里找到了一些"OptionConverters"(例如这里),但它们似乎并不像我正在寻找的那样.
我在集成测试环境中使用LocalDb - 在我的测试运行之前和之后实例化和处理我的实例.
但是,当我在我的实例中创建数据库时,它仍然将我的表和数据刷新到磁盘.是否可以在"内存"模式下运行LocalDb?如果是这样怎么样?
我正在尝试使用表达式树构建一个lambda表达式.这是我试图创建的lambda表达式的格式:
Func<DateTime, string> requiredLambda = dt =>
{
var formattedDate = dt.ToShortDateString();
/**
* The logic is not important here - what is important is that I
* am using the result of the executed lambda expression.
* */
var builder = new StringBuilder();
builder.Append(formattedDate);
builder.Append(" Hello!");
return builder.ToString();
};
Run Code Online (Sandbox Code Playgroud)
问题是我不是从头开始构建这个树 - 格式化逻辑已经以一个实例的形式传递给我Expression<Func<DateTime, string>>- 比如说:
Expression<Func<DateTime, string>> formattingExpression = dt => dt.ToShortDateString();
Run Code Online (Sandbox Code Playgroud)
我知道外面的表达式树的我可以打电话
formattingExpression.Compile()(new DateTime(2003, 2, 1))
Run Code Online (Sandbox Code Playgroud)
评估表达式 - 但问题是我希望在表达式树中评估和分配它- 允许我在表达式树中对结果执行额外的逻辑.
到目前为止,我没有想到的任何事情似乎都是这样做的 - 几乎可以肯定是对表达树如何工作的误解.任何帮助非常感谢!
如何使用Fable从中消耗数据并将数据推送到websocket?我发现这个github问题表明它可以完成,但找不到任何文档或如何实现这一目的的示例.
我希望使用F#将字符串解析为递归数据结构.在这个问题中,我将提出一个简化的例子,它将切入我想要做的事情的核心.
我想将一串嵌套的方括号解析为记录类型:
type Bracket = | Bracket of Bracket option
Run Code Online (Sandbox Code Playgroud)
所以:
Bracket NoneBracket ( Some ( Bracket None) )Bracket ( Some ( Bracket ( Some ( Bracket None) ) ) )我想使用FParsec库中的解析器组合器来完成此操作.这是我到目前为止:
let tryP parser =
parser |>> Some
<|>
preturn None
/// Parses up to nesting level of 3
let parseBrakets : Parser<_> =
let mostInnerLevelBracket =
pchar '['
.>> pchar ']'
|>> fun _ -> Bracket None …Run Code Online (Sandbox Code Playgroud) 我正在尝试IDispatchMessageInspector在F#中实现(WCF名声)界面:
open System.ServiceModel.Dispatcher
open System.ServiceModel.Channels
type ServiceInterceptor() as interceptor =
abstract member PreInvoke : byref<Message> -> obj
abstract member PostInvoke : byref<Message> -> obj -> unit
default x.PreInvoke m = null
default x.PostInvoke m s = ()
interface IDispatchMessageInspector with
member x.AfterReceiveRequest(request, channel, instanceContext) = interceptor.PreInvoke(&request)
member x.BeforeSendReply(reply : byref<Message>, correlationState) = interceptor.PostInvoke &reply correlationState
Run Code Online (Sandbox Code Playgroud)
无法编译时出现以下错误:
但是,如果我将代码修改为以下内容(请注意签名的更改PostInvoke),一切正常:
open System.ServiceModel.Dispatcher
open System.ServiceModel.Channels
type ServiceInterceptor() as interceptor =
abstract member PreInvoke : byref<Message> -> obj
abstract member PostInvoke …Run Code Online (Sandbox Code Playgroud)