我刚刚注意到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 ...获得我想要的结果,但我刚刚发现了另一种模式匹配的语法,如果我不知道如何使用它,它会永远唠叨我.
如何使用上面显示的替代模式匹配语法编写函数?
我正在用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) 我正在尝试实现计算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) 如果我需要用现有对象初始化对象的基础,我该怎么办?例如,在这种情况下:
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中执行此操作
让我们说我想刮一个网页,并提取一些数据.我最有可能写这样的东西:
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!语句?
我有几百个Excel文件,其中每个文件在第一张表上都有一些数据.我被要求在C#中编写一个控制台应用程序,它将所有Excel文件合并到一个文档中,同时保留格式.
合并文件是单个工作簿,其中包含合并到文档中的每个文件的工作表.不幸的是,Excel文件是二进制而不是XML格式,因此我无法执行XSL转换.
是否有免费的库或示例代码,演示如何将来自多个Excel文档的工作表组合到一个文件中?
我有一个包含两个文件的文件夹:
此外,第三方应用程序处理文件如下:
folderPath和asearchPatternDirectory.GetFiles(folderPath, searchPattern),处理与批量过滤器匹配的任何文件,然后将文件移动到存档文件夹.事实证明,我必须将我的两个文件移动到不同的存档文件夹中,因此我需要通过提供不同的searchPatterns来单独选择它们来单独处理它们.请注意,我无法修改第三方应用程序,但我可以修改数据库中的searchPattern和文件目标.
什么searchPattern允许我选择Awesome.File.20091031_123002.txt不包括Awesome.File.Summary.20091031_123152.txt?
我正在使用外部页面来更新系统中的图像.当我被重定向回到我曾经工作的页面时,我仍然看到旧图片.在按ctrl + f5之前,我没有看到我的更改.他们以任何方式重定向历史记录删除或任何其他解决方案?
假设我有一个像这样的错误应用程序:
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注入可能仍然有用于其他目的:)
我有一个邮箱处理器,它接收固定数量的邮件:
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)
是否保证在发送的订单中接收和处理消息?或者是否可能无序接收或处理消息?