摆脱F#中的"厄运金字塔"

Ste*_*ven 9 f#

我有几个口头表达式,我已经打包成一个函数:

open FsVerbalExpressions
open FsVerbalExpressions.VerbalExpression
open System.Text.RegularExpressions
open System

let createOrVerbExFromList (verbExList: VerbEx list) = 
    let orVerbEx = 
        verbExList
        |> List.reduce (fun acc thing -> verbExOrVerbEx RegexOptions.IgnoreCase acc thing) //simpleVerbEx

    orVerbEx 

let k12VerbEx =     
    let kTo12 =  ["SCHOOL"; "DIST"; "SD"; "HS"; "BD OF ED"]
    kTo12
    |> List.map (fun word -> VerbEx(word))
    |> createOrVerbExFromList

let twoYearCollegeVerbEx = 
    VerbEx("2 Year College")

let universityVerbEx = 
    VerbEx("UNIV")

let privateSchoolVerbEx = 
    VerbEx("ACAD")

//Here there be dragons:
let newInst (x: string) =
    match (isMatch x k12VerbEx) with 
    | true -> "K - 12"
    | _ -> match (isMatch x twoYearCollegeVerbEx) with
            | true -> "2 Year College"
            | _ -> match (isMatch x universityVerbEx) with
                    | true -> "University" 
                    | _ -> match (isMatch x privateSchoolVerbEx) with
                            | true -> "Private / Charter School"
                            | _ -> "Other"
Run Code Online (Sandbox Code Playgroud)

我想重写newInst功能,使得它不再是"厄运的金字塔.我的问题是我怎么能摆脱厄运的金字塔? 可以我摆脱它?我有怀疑,这将是某种形式的的async工作流程或其他计算式,但这些都是新的给我.

Tar*_*mil 18

如果你只匹配布尔值,那就if ... elif足够了:

let newInst (x: string) =
    if isMatch x k12VerbEx then
        "K - 12"
    elif isMatch x twoYearCollegeVerbEx then
        "2 Year College"
    elif isMatch x universityVerbEx then
        "University"
    elif isMatch x privateSchoolVerbEx then
        "Private / Charter School"
    else
        "Other"
Run Code Online (Sandbox Code Playgroud)

更灵活的可能性是创建一个活动模式:

let (|IsMatch|_|) f x =
    if isMatch x f then Some () else None

let newInst (x: string) =
    match x with
    | IsMatch k12VerbEx -> "K - 12"
    | IsMatch twoYearCollegeVerbEx -> "2 Year College"
    | IsMatch universityVerbEx -> "University"
    | IsMatch privateSchoolVerbEx -> "Private / Charter School"
    | _ -> "Other"
Run Code Online (Sandbox Code Playgroud)

  • `| _`表示部分活动模式,这意味着它可能与所有值都不匹配(这就是它返回选项的原因).[参见文档](http://stackoverflow.com/documentation/f%23/962/active-patterns/23523/complete-and-partial-active-patterns#t=201610041942173049847)关于总AP和部分AP之间的区别.在你的情况下,你可能真的想要编写一个完整的AP,但它的实现本身将受到同样的厄运金字塔:) (2认同)