f# - 模式匹配有多聪明?

标签 f# pattern-matching

我的程序大部分时间都花在数组模式匹配上,我在想我是否应该重写函数并放弃自动模式匹配。

例如一个非常简单的案例

let categorize array =
    match array with
    | [|(1|2);(1|2);(1|2)|] -> 3
    | [|(1|2);(1|2);_|] -> 2
    | [|(1|2);_;_|] -> 1
    | _ -> 0

categorize [|2;1;3|]

在这种情况下,编译器是否会通过识别例如除了第三个元素外,第一种情况与第二种情况相同。

实际上模式更复杂,预优化的模式匹配可能比完全优化的模式匹配花费更多的时间。

最佳答案

直接来自 Reflector:

public static int categorize(int[] array)
{
    if ((array > null) && (array.Length == 3))
    {
        switch (array[0])
        {
            case 1:
                switch (array[1])
                {
                    case 1:
                        switch (array[2])
                        {
                            case 1:
                            case 2:
                                goto Label_005C;
                        }
                        goto Label_005A;

                    case 2:
                        switch (array[2])
                        {
                            case 1:
                            case 2:
                                goto Label_005C;
                        }
                        goto Label_005A;
                }
                goto Label_0042;

            case 2:
                switch (array[1])
                {
                    case 1:
                        switch (array[2])
                        {
                            case 1:
                            case 2:
                                goto Label_005C;
                        }
                        goto Label_005A;

                    case 2:
                        switch (array[2])
                        {
                            case 1:
                            case 2:
                                goto Label_005C;
                        }
                        goto Label_005A;
                }
                goto Label_0042;
        }
    }
    return 0;
Label_0042:
    return 1;
Label_005A:
    return 2;
Label_005C:
    return 3;
}

我没有看到任何低效的东西。

关于f# - 模式匹配有多聪明?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13871524/

相关文章:

asynchronous - 如何并行执行两个具有不同结果类型的 Async<> 调用?

linq - 如何将 IGrouping<Key, Value> 映射到 IGrouping<Key, Value>?

f# - 如何在 F# 中打印 map 的内容

f# - 有用的 F# 脚本

typescript - 匹配 Typescript 中可能的类型文字

scala - 字节模式匹配数组

rust - 如何匹配Rust中的嵌套字符串

asynchronous - F# 异步文件复制

java - 分割用户模式匹配器

regex - 如何在 Emacs 中设置 reftex-view-crossref-extra?