天道酬勤,学无止境

f#

与 F# List.nth 的参数顺序混淆(Confused with F# List.nth's argument order)

问题 List.nth是'T list -> int -> 'T ,而不是标准的int -> 'T list -> 'T就像Seq.nth 。 这使得管道有些尴尬。 幕后有什么事情吗? 我不知道为什么。 回答1 可能是为了 ocaml 兼容性(或只是懒惰),但没有关于实现本身的更深层次的原因。 回答2 此签名允许您针对给定列表对函数进行柯里化。 这允许您保留 List.nth someList 存储,并使用它来获取列表的第 n 个元素,而不必每次都指定列表变量。 不过,我不确定为什么它与其他 F# 函数不一致。

2021-09-20 04:34:21    分类:技术分享    f#

基于函数签名的模式匹配(Pattern matching based on the function signature)

问题 在 F# 中,您可以对函数签名进行模式匹配。 我想用一个函数来装饰许多函数,该函数测量函数的执行并调用 statsd。 我目前的功能是: let WrapFunctionWithPrefix(metrics:Metric.Client.IRecorder, functionToWrap, prefix) = let metricsIdentifier = (sprintf "%s.%s" prefix Environment.MachineName) using (metrics.StartTimer(metricsIdentifier)) ( fun metrics -> functionToWrap) 正如您在上面看到的,前缀会有所不同,在我们的应用程序中,这将因函数定义而异。 因此,不必每次我想做以下事情时都必须传入度量前缀: let WrapFunction metrics afunc = match afunc with | :? (int -> int) -> WrapFunctionWithPrefix(metrics, afunc, "My function 1") | :? (string -> string) -> WrapFunctionWithPrefix(metrics, afunc, "My function 2") | _ -> failwith

2021-09-20 02:13:32    分类:技术分享    f#   functional-programming   statsd

F# 值阴影 - 是否可以在同一范围内禁用值阴影(F# value shadowing - is it possible to disable value shadowing within the same scope)

问题 由于复制/粘贴,我在自己的代码中发现了一个错误。 相同的值名称被复制/粘贴在相同的范围内。 let func() = let a = 1 let a = something_else .... 在 C# 中,我不会通过编译。 有没有办法禁用阴影? 至少在同一级别的范围内? 谢谢 回答1 您不能在 F# 中禁用阴影——这是一项重要的语言功能。 但是,您可以指示编译器发出警告或错误,以帮助您捕获意外阴影的情况。 在项目属性中,将 --warnon:1182 添加到“其他标志”文本框(在构建选项卡上,在平台目标下拉列表下)。 当您不小心隐藏变量并导致它不能在任何地方使用时,这会触发编译器警告。 如果您希望这些情况导致编译失败,您还可以将1182添加到“构建”选项卡的“将警告视为错误”部分下的“特定警告”文本框。 最后 -- 安装 Visual F# Power Tools 扩展。 它提供了额外的语法高亮功能,并会指示未使用的变量,因此它们很容易在您的代码中被发现。

2021-09-20 00:33:25    分类:技术分享    f#   shadowing

无法在 F# 中创建列表文字(Cannot create list literal in F#)

问题 我有以下类型 type StatusCode = | OK = 200 | NoContent = 204 | MovedTemp = 301 | MovedPerm = 302 | SeeOther = 303 | NotModified = 304 | NotFound = 404 | ServerError = 500 [<Literal>] let NoBodyAllowedStatusCodes = [StatusCode.NoContent; StatusCode.NotModified] 我收到一个编译时错误,内容为: 这不是有效的常量表达式或自定义属性值 我真的无法弄清楚这里出了什么问题。 回答1 通常在 F# 和 .NET 中,列表不能是文字(C#/VB.NET 中的常量)。 只有原始值可以,如string 、 bool等。 F# 3.0 规范在第 10.2.2 节中有关于什么可以是文字的指南: 具有 Literal 属性的值受以下限制: 它不能被标记为可变的或内联的。 它可能也没有 ThreadStatic 或 ContextStatic 属性。 右侧表达式必须是由以下任一组成的文字常量表达式: 一个简单的常量表达式,除了 ()、本机整数文字、无符号本机整数文字、字节数组文字、BigInteger 文字和用户定义的数字文字。 -要么- 对另一个文字的引用。

2021-09-19 17:12:48    分类:技术分享    f#   compile-time-constant   constant-expression

以乘法的优先级解析“xyz”(Parsing “x y z” with the precedence of multiply)

问题 我正在尝试使用 FParsec 为 F# 中的 Mathematica 语言编写解析器。 我为 MiniML 编写了一个支持语法fxy = (f(x))(y)的函数应用程序具有高优先级。 现在我需要使用相同的语法来表示f*x*y ,因此,与乘法具有相同的优先级。 特别是, xy + 2 = x*y + 2而xy ^ 2 = x * y^2 。 如何做到这一点? 回答1 正如 Stephan 在评论中指出的那样,您可以将运算符解析器拆分为两个单独的解析器,并将您自己的解析器放在中间以进行空格分隔的表达式。 以下代码演示了这一点: #I "../packages/FParsec.1.0.1/lib/net40-client" #r "FParsec" #r "FParsecCS" open FParsec open System.Numerics type Expr = | Int of BigInteger | Add of Expr * Expr | Mul of Expr * Expr | Pow of Expr * Expr let str s = pstring s >>. spaces let pInt : Parser<_, unit> = many1Satisfy isDigit |>> BigInteger.Parse .>> spaces let high =

2021-09-19 15:58:17    分类:技术分享    f#   fparsec

VS2008 和 VS2010 并排的 FSharp.Compiler.CodeDom(FSharp.Compiler.CodeDom for VS2008 and VS2010 side-by-side)

问题 我正在使用 FSharp.Compiler.CodeDom(来自 PowerPack)来动态创建 F# 类。 问题是,我的计算机上并排安装了 VS2008 和 VS2010(它们工作正常),并且在此配置中使用 F# 充其量是有问题的: 如果我不安装 InstallFSharp.msi,那么在 VS2008 下,构建的类会抱怨找不到 FSharp.Core(即使它们被引用) 如果我安装 InstallFSharp.msi,那么在 VS2008 下构建的类将使用为 VS2010 构建的 F#,并且会抛出二进制不兼容异常,因为它将加载 .net4 变体: FSC:错误 FS0219:引用的或默认的基本 CLI 库“mscorlib”与引用的 F# 核心库“C:\Program Files (x86)\Microsoft F#\v4.0\FSharp.Core.dll”二进制不兼容。 考虑重新编译该库或对该库的与您使用的 CLI 版本匹配的版本进行显式引用。 如果我将之前位置找到的 F# 替换为单独安装的 dll-s,那么当然 VS2010 会抱怨二进制不兼容 我是否忽略了某些东西,或者它们不会简单地在这样的共享环境中工作? 当我部署应用程序时,这可能意味着真正的问题。 谢谢 回答1 我自己也有类似的问题 - 我们的源代码树的树干设置为使用 VS 2008 构建

2021-09-19 13:49:09    分类:技术分享    f#   compilation   compatibility   codedom   side-by-side

如何在 F# Akka.NET Actor 中存储状态?(How to store state in an F# Akka.NET Actor?)

问题 在 C# ReceiveActor我可以将状态作为类中的私有字段。 我应该如何使用 F# API 以惯用的方式执行此操作? 这是一个好主意吗? 任何替代方案? let handleMessage (mailbox: Actor<'a>) msg = let mutable i = 1 match msg with | Some x -> i <- i + x | None -> () 回答1 您提出的方式完全适合作为在 actor 中存储状态的一种方式。 任何时候只处理 1 条消息的并发限制意味着不可能由于共享内存位置的争用而进入无效状态。 但是,这不是最惯用的选项。 Akka.Net 提供了一个 F# API,以与 F# MailboxProcessors 类似的方式处理 actor。 在这种情况下,您将actor 定义为尾递归函数,它用一些新状态调用自己。 这是一个例子 spawn system "hello" <| fun mailbox -> let rec loop state = actor { let! msg = mailbox.Receive () printfn "Received %A. Now received %s messages" msg state return! loop (state + 1) //Increment a counter

2021-09-19 06:47:03    分类:技术分享    f#   actor   akka.net

如何在 F# Akka.NET Actor 中存储状态?(How to store state in an F# Akka.NET Actor?)

问题 在 C# ReceiveActor我可以将状态作为类中的私有字段。 我应该如何使用 F# API 以惯用的方式执行此操作? 这是一个好主意吗? 任何替代方案? let handleMessage (mailbox: Actor<'a>) msg = let mutable i = 1 match msg with | Some x -> i <- i + x | None -> () 回答1 您提出的方式完全适合作为在 actor 中存储状态的一种方式。 任何时候只处理 1 条消息的并发限制意味着不可能由于共享内存位置的争用而进入无效状态。 但是,这不是最惯用的选项。 Akka.Net 提供了一个 F# API,以与 F# MailboxProcessors 类似的方式处理 actor。 在这种情况下,您将actor 定义为尾递归函数,它用一些新状态调用自己。 这是一个例子 spawn system "hello" <| fun mailbox -> let rec loop state = actor { let! msg = mailbox.Receive () printfn "Received %A. Now received %s messages" msg state return! loop (state + 1) //Increment a counter

2021-09-19 06:44:09    分类:技术分享    f#   actor   akka.net

我的第一个 F# 程序(My First F# program)

问题 我刚刚写完我的第一个 F# 程序。 功能方面,代码按照我想要的方式工作,但不确定代码是否有效。 如果有人能为我审查代码并指出代码可以改进的地方,我将不胜感激。 谢谢苏达利 open System open System.IO open System.IO.Pipes open System.Text open System.Collections.Generic open System.Runtime.Serialization [<DataContract>] type Quote = { [<field: DataMember(Name="securityIdentifier") >] RicCode:string [<field: DataMember(Name="madeOn") >] MadeOn:DateTime [<field: DataMember(Name="closePrice") >] Price:float } let m_cache = new Dictionary<string, Quote>() let ParseQuoteString (quoteString:string) = let data = Encoding.Unicode.GetBytes(quoteString) let stream = new MemoryStream()

2021-09-18 19:19:18    分类:技术分享    f#

F#记录成员评估(F# record member evaluation)

问题 为什么每次调用都要评估 tb? 有没有办法让它只评估一次? type test = { a: float } member x.b = printfn "oh no" x.a * 2. let t = { a = 1. } t.b t.b 回答1 这是一种财产; 您基本上是在调用get_b()成员。 如果您希望效果在构造函数中发生一次,您可以使用一个类: type Test(a:float) = // constructor let b = // compute it once, store it in a field in the class printfn "oh no" a * 2. // properties member this.A = a member this.B = b 回答2 布赖恩答案的另一种版本,最多只对b进行一次评估,但如果从未使用过B则根本不会对其进行评估 type Test(a:float) = // constructor let b = lazy printfn "oh no" a * 2. // properties member this.A = a member this.B = b.Value 回答3 为了回应您在 Brian 的帖子中的评论,您可以使用可选/命名参数伪造复制和更新记录表达式。 例如: type Person(

2021-09-18 18:33:08    分类:技术分享    f#   record   member