小编Jul*_*iet的帖子

如何在'let'定义中使用模式匹配?

我刚刚注意到F#允许我使用带有文字和其他模式的let绑定,如下所示:

let fib 0 = 1
let exists item [] = false
let car (hd :: tl) = hd
let cdr (hd :: tl) = tl
Run Code Online (Sandbox Code Playgroud)

F#正确地将这些函数解释为一种模式匹配,因为我给出了以下警告:

警告1此表达式的不完整模式匹配.例如,值"1"将不匹配

警告2此表达式的不完整模式匹配.例如,值"[_]"将不匹配

等等

这些函数按预期工作,但我想用这种样式定义一个具有完全模式匹配的函数,但是我在F#手册中找不到关于这种替代模式匹配语法的任何信息.

我知道我可以使用let whatever = function ...let whatever x = match x with ...获得我想要的结果,但我刚刚发现了另一种模式匹配的语法,如果我不知道如何使用它,它会永远唠叨我.

如何使用上面显示的替代模式匹配语法编写函数?

syntax f# pattern-matching

10
推荐指数
3
解决办法
1889
查看次数

如何在C#中模拟匿名类

我正在用C#编写一个小型数据结构库,我遇到了一个架构问题.基本上我有一个实现访问者模式的类,并且有许多可能的访问者实现:

public interface ITreeVisitor<T, U>
{
    U Visit(Nil<T> s);
    U Visit(Node<T> s);
}

public abstract class Tree<T> : IEnumerable<T>
{
    public readonly static Tree<T> empty = new Nil<T>();
    public abstract U Accept<U>(ITreeVisitor<T, U> visitor);
}

public sealed class Nil<T> : Tree<T>
{
    public override U Accept<U>(ITreeVisitor<T, U> visitor) { return visitor.Visit(this); }
}

public sealed class Node<T> : Tree<T>
{
    public Tree<T> Left { get; set; }
    public T Value { get; set; }
    public Tree<T> Right { get; set; …
Run Code Online (Sandbox Code Playgroud)

c# design-patterns anonymous-class

10
推荐指数
1
解决办法
522
查看次数

RGB到CMYK和后退算法

我正在尝试实现计算RGB和CMYK之间转换的解决方案,反之亦然.这是我到目前为止:

  public static int[] rgbToCmyk(int red, int green, int blue)
    {
        int black = Math.min(Math.min(255 - red, 255 - green), 255 - blue);

        if (black!=255) {
            int cyan    = (255-red-black)/(255-black);
            int magenta = (255-green-black)/(255-black);
            int yellow  = (255-blue-black)/(255-black);
            return new int[] {cyan,magenta,yellow,black};
        } else {
            int cyan = 255 - red;
            int magenta = 255 - green;
            int yellow = 255 - blue;
            return new int[] {cyan,magenta,yellow,black};
        }
    }

    public static int[] cmykToRgb(int cyan, int magenta, int yellow, int black) …
Run Code Online (Sandbox Code Playgroud)

java rgb cmyk

10
推荐指数
3
解决办法
3万
查看次数

在.NET中初始化基类

如果我需要用现有对象初始化对象的基础,我该怎么办?例如,在这种情况下:

public class A
{
    public string field1;
    public string field2;
}

public class B : A
{
    public string field3;
    public void Assign(A source)
    {
        this.base = source; // <-- will not work, what can I do here?
    }
}
Run Code Online (Sandbox Code Playgroud)

Assign()方法显然可以逐字段地为基类赋值,但是没有更好的解决方案吗?由于B类继承自A,因此必须有一种方法可以将A分配给B.base

在C++中,这将是一件微不足道的事情,但我似乎无法掌握如何在.NET中执行此操作

.net c# oop

8
推荐指数
3
解决办法
1万
查看次数

使用异步工作流并行化的最佳实践

让我们说我想刮一个网页,并提取一些数据.我最有可能写这样的东西:

let getAllHyperlinks(url:string) =
    async {  let req = WebRequest.Create(url)
             let! rsp = req.GetResponseAsync()
             use stream = rsp.GetResponseStream()             // depends on rsp
             use reader = new System.IO.StreamReader(stream)  // depends on stream
             let! data = reader.AsyncReadToEnd()              // depends on reader
             return extractAllUrls(data) }                    // depends on data
Run Code Online (Sandbox Code Playgroud)

let!讲述F#在另一个线程来执行代码,然后将结果结合到一个变量,并继续处理.上面的示例使用两个let语句:一个用于获取响应,一个用于读取所有数据,因此它至少生成两个线程(如果我错了,请纠正我).

虽然上面的工作流程会产生多个线程,但执行顺序是串行的,因为工作流程中的每个项目都依赖于前一个项目.在其他线程返回之前,无法在工作流程中进一步评估任何项目.

let!在上面的代码中有多个有什么好处?

如果没有,该代码如何更改以利用多个let!语句?

f# asynchronous async-workflow

8
推荐指数
1
解决办法
1268
查看次数

将Excel文件合并为一个

我有几百个Excel文件,其中每个文件在第一张表上都有一些数据.我被要求在C#中编写一个控制台应用程序,它将所有Excel文件合并到一个文档中,同时保留格式.

合并文件是单个工作簿,其中包含合并到文档中的每个文件的工作表.不幸的是,Excel文件是二进制而不是XML格式,因此我无法执行XSL转换.

是否有免费的库或示例代码,演示如何将来自多个Excel文档的工作表组合到一个文件中?

.net excel

8
推荐指数
1
解决办法
3万
查看次数

使用Directory.GetFiles与类似regex的过滤器

我有一个包含两个文件的文件夹:

  • Awesome.File.20091031_123002.txt
  • Awesome.File.Summary.20091031_123152.txt

此外,第三方应用程序处理文件如下:

  • 读取数据库中的a folderPath和asearchPattern
  • 执行Directory.GetFiles(folderPath, searchPattern),处理与批量过滤器匹配的任何文件,然后将文件移动到存档文件夹.

事实证明,我必须将我的两个文件移动到不同的存档文件夹中,因此我需要通过提供不同的searchPatterns来单独选择它们来单独处理它们.请注意,我无法修改第三方应用程序,但我可以修改数据库中的searchPattern和文件目标.

什么searchPattern允许我选择Awesome.File.20091031_123002.txt不包括Awesome.File.Summary.20091031_123152.txt

c#

8
推荐指数
4
解决办法
1万
查看次数

如何在我的网站上编辑图像后清除图像缓存?

我正在使用外部页面来更新系统中的图像.当我被重定向回到我曾经工作的页面时,我仍然看到旧图片.在按ctrl + f5之前,我没有看到我的更改.他们以任何方式重定向历史记录删除或任何其他解决方案?

c# asp.net

8
推荐指数
1
解决办法
7295
查看次数

程序化MSIL注入

假设我有一个像这样的错误应用程序:

using System;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("2 + 1 = {0}", Add(2, 1));
        }

        static int Add(int x, int y)
        {
            return x + x; // <-- oops!
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

该应用程序已经编译并部署到野外.有人找到了这个bug,现在他们要求修复它.虽然我可以使用修复程序重新部署此应用程序,但由于我无法控制的原因,这是一个极端的麻烦 - 我只是想为bug编写补丁.

具体来说,我想将自己的MSIL插入有问题的assmembly源文件中.我之前从未做过这样的事情,谷歌搜索没有发现任何有用的信息.如果我能在上面的代码中看到如何执行此操作的示例,它将极大地帮助我:)

如何以编程方式将我自己的MSIL注入已编译的.NET程序集中?

[编辑添加:]对于那些问:我不需要运行时hotswapping.对我来说完全没问题,关闭应用程序,操纵程序集,然后重新启动程序.

[编辑一次:]看起来普遍的共识是"操纵程序集是修补程序的一种方法".如果这是一个坏主意,我不会走那条路.

我将问题保持开放,因为MSIL注入可能仍然有用于其他目的:)

.net cil

7
推荐指数
1
解决办法
2555
查看次数

保证邮件发送到邮箱处理器的邮件顺序

我有一个邮箱处理器,它接收固定数量的邮件:

let consumeThreeMessages = MailboxProcessor.Start(fun inbox ->
        async {
            let! msg1 = inbox.Receive()
            printfn "msg1: %s" msg1

            let! msg2 = inbox.Receive()
            printfn "msg2: %s" msg2

            let! msg3 = inbox.Receive()
            printfn "msg3: %s" msg3
        }
    )

consumeThreeMessages.Post("First message")
consumeThreeMessages.Post("Second message")
consumeThreeMessages.Post("Third message")
Run Code Online (Sandbox Code Playgroud)

应该按照发送的顺序处理这些消息.在我的测试过程中,它会准确打印出它应该是什么:

First message
Second message
Third message
Run Code Online (Sandbox Code Playgroud)

但是,由于邮件发布是异步的,因此听起来像快速发布3条消息可能会导致按任何顺序处理项目.例如,我不想不按顺序接收消息并得到类似这样的信息:

Second message // <-- oh noes!
First message
Third message 
Run Code Online (Sandbox Code Playgroud)

是否保证在发送的订单中接收和处理消息?或者是否可能无序接收或处理消息?

concurrency f#

7
推荐指数
1
解决办法
426
查看次数