小编Bra*_*rad的帖子

如何编写功能文件"扫描仪"

首先让我为这个问题的规模道歉,但我真的想在功能上思考,这是我必须要处理的更具挑战性的问题之一.

我希望得到一些关于如何以功能方式处理问题的建议,特别是在F#中.我正在编写一个程序来浏览目录列表并使用正则表达式模式列表来过滤从目录中检索到的文件列表,并使用第二个正则表达式模式列表来查找已检索文件的文本中的匹配项.我希望这件事能够返回与给定正则表达式模式匹配的每段文本的文件名,行索引,列索引,模式和匹配值.此外,需要记录异常并且有3种可能的异常情况:无法打开目录,无法打开文件,从文件读取内容失败.最后的要求是匹配的"扫描"文件的数量可能非常大,所以整个事情需要很懒惰.我并不太担心"纯粹"的功能解决方案,因为我对一个阅读良好且性能良好的"好"解决方案感兴趣.最后一个挑战是使其与C#互操作,因为我想使用winform工具将此算法附加到ui.这是我的第一次尝试,希望这将澄清问题:

open System.Text.RegularExpressions
open System.IO

type Reader<'t, 'a> = 't -> 'a //=M['a], result varies

let returnM x _ = x 

let map f m = fun t -> t |> m |> f

let apply f m = fun t -> t |> m |> (t |> f)

let bind f m = fun t -> t |> (t |> m |> f)

let Scanner dirs =
    returnM dirs
    |> apply (fun dirExHandler ->
        Seq.collect (fun directory -> …
Run Code Online (Sandbox Code Playgroud)

f# functional-programming

6
推荐指数
1
解决办法
1836
查看次数

F#将none传递给函数,将null作为参数值

这真的很奇怪,我担心我做了一些愚蠢的事,但我无法理解.

我作为第一个参数传递None给函数some但是当函数执行时,值为parentNodenull(我不关心它打印null for None,函数参数值IS null not None).我最终在打印功能行上得到一个空引用错误,因为parentNode为null.我试图改变args并改变顺序,但这并没有帮助.我有一种潜在的怀疑,认为这与卷曲有关,但我不知所措......

我不得不用公司问题的空字符串替换真正的url值,但如果有帮助的话,它是xsd的url

这是代码:

#light
open System
open System.Xml
open System.Net
open System.Collections.Generic

type StartResult =
    | Parameters of XsdParserParameters
    | Xsd of Xsd

and Xsd(text) =
    let rows = new List<string>()

    member this.Text
        with get() = text

    member this.Rows
        with get() = rows

and XsdParserParameters() =
    let mutable url = ""

    member this.Url
        with get() = url
        and set(value) = url <- value

    member this.Start() = …
Run Code Online (Sandbox Code Playgroud)

.net f#

5
推荐指数
1
解决办法
845
查看次数

需要帮助找出如何在spring boot java app中从yml加载嵌套列表

我有一个像这样的yaml文件设置:

system:
  locators:
  - first.com
    - 103
    - 105
  - second.com
    - 105
Run Code Online (Sandbox Code Playgroud)

我想加载这个@autowired配置看起来像这样:

@Autowired
List<Locator> locators;
Run Code Online (Sandbox Code Playgroud)

我认为Locator类看起来像这样:

class Locator {
    String name;
    List<String> ports;
}
Run Code Online (Sandbox Code Playgroud)

但我不知道如何把这一切都放在一起.任何帮助表示赞赏!

java yaml spring-boot

5
推荐指数
1
解决办法
3207
查看次数

f#console app不起作用.c#console app可以

我正在尝试将一个简单的f#控制台应用程序部署到同事计算机,但它仍然失败.双击应用程序图标后,将出现控制台窗口,但随后出现Microsoft错误报告窗口,询问我是否要发送错误报告,然后拒绝控制台窗口中的某些文本闪烁.它看起来像一个错误消息,但窗口关闭太快而无法分辨.奇怪的是,如果我创建一个类似的C#应用​​程序,它的工作原理.我在发布模式下瞄准.net 4客户端框架.

这是代码

f#代码(不起作用):

open System

printfn "print test"
Console.ReadLine() |> ignore
Run Code Online (Sandbox Code Playgroud)

c#代码(确实有效):

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace TestCApplication
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Testing...");
            Console.ReadLine();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

c# console f#

3
推荐指数
2
解决办法
1014
查看次数

是否可以使用序列尾调用f#优化分组函数?

这是我的尝试,不是尾部调用优化,因为我需要处置枚举器:

let Group func seed (items : seq<'t>) = 
    let rec some (i : IEnumerator<'t>) state = seq {
        try
            if i.MoveNext()
            then
                let newstate, iscomplete = func (i.Current) state
                if iscomplete
                then 
                    yield newstate
                    yield! some i newstate
            else
                yield state
        finally
            i.Dispose() }

    some (items.GetEnumerator ()) seed
Run Code Online (Sandbox Code Playgroud)

以下是示例用法:

let buffer maxBufferSize items =
    Group (fun item state ->
        let newstate = [ item ] |> List.append state
        if newstate.Length >= maxBufferSize
        then (newstate, true)
        else (newstate, false)) List.empty …
Run Code Online (Sandbox Code Playgroud)

f# tail-recursion tail-call-optimization

2
推荐指数
1
解决办法
127
查看次数

可以查询clojure多方法的调度值吗?

我正在写一些看起来像这样的代码:

(def
  authorized-access-levels
  {:sales-rep-manager (fn [{{user :user} :session}]

                        )
   :regional-sales-manager (fn [{{user :user} :session}]

                             )
   :vp-of-sales (fn [{{user :user} :session}]

                  )
   })
Run Code Online (Sandbox Code Playgroud)

稍后在代码中:

(defn
  get-my-housing
  [{{user :user} :session :as request}]
  (let [data-fn (authorized-access-levels (user :access-level))]
    (data-fn request)))
Run Code Online (Sandbox Code Playgroud)

在表面级别,这似乎是多方法的一个很好的用例,其中defmulti看起来像这样:

(defmulti get-my-housing (fn [{{{access-level :access-level} :user} :session}] access-level))
(defmethod get-my-housing :vp-of-sales [{{user :user} :session}]

  )
Run Code Online (Sandbox Code Playgroud)

但我有另一个需要,看起来像这样:

:auth-fn (fn [user] (contains? authorized-access-levels (user :access-level)))
Run Code Online (Sandbox Code Playgroud)

所以(长话短说)我需要键来确定用户是否有权获取数据,然后我使用密钥通过地图发送到函数.

我可以查询多方法以查看它的调度值是什么吗?如果是这样,那么我可以将其作为多方法编写,然后查询它以进行授权.还有其他想法吗?

clojure

2
推荐指数
1
解决办法
666
查看次数