首先让我为这个问题的规模道歉,但我真的想在功能上思考,这是我必须要处理的更具挑战性的问题之一.
我希望得到一些关于如何以功能方式处理问题的建议,特别是在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) 这真的很奇怪,我担心我做了一些愚蠢的事,但我无法理解.
我作为第一个参数传递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) 我有一个像这样的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)
但我不知道如何把这一切都放在一起.任何帮助表示赞赏!
我正在尝试将一个简单的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) 这是我的尝试,不是尾部调用优化,因为我需要处置枚举器:
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) 我正在写一些看起来像这样的代码:
(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)
所以(长话短说)我需要键来确定用户是否有权获取数据,然后我使用密钥通过地图发送到函数.
我可以查询多方法以查看它的调度值是什么吗?如果是这样,那么我可以将其作为多方法编写,然后查询它以进行授权.还有其他想法吗?