F#指å—是å¦å»ºè®®ç”³æŠ¥æ¨¡å—&类型å称相åŒï¼Ÿ

时间:2017-06-12 03:31:36

标签: .net module f# naming-conventions record

在阅读F# Component Design GuidelinesåŽï¼Œæˆ‘没有看到任何评论我是å¦åº”该声明模å—&它的类型具有相åŒçš„å称。

通常我的项目没有任何循环ä¾èµ–,因此我ä¸éœ€è¦åˆ¶ä½œæ–°æ¨¡å—(例如InfrastructureTypes或DomainTypes)将æ¯ç§ç±»åž‹æ”¾åœ¨ä¸€ä¸ªåœ°æ–¹

例如,如果我有一个记录类型System和一堆函数,我应该把所有内容放在一个模å—文件中å—?这是我的å°è¯•ï¼š

// System.fs
module System

type rec System =
    { name : string
      children : System list }

let init () = { name = ""; children = [] }

let addChild system child =
    { system with system.children = child :: system.children }

let removeChild system child =
    let rec removeChild children acc child =
        match children with
        | c :: children ->
            if c <> child then removeChild children (c :: acc) child
            else removeChild children acc child
        | [] -> List.rev acc

    let children = removeChild system.Children [] child
    { system with system.children = children }

1 个答案:

答案 0 :(得分:6)

F#核心库本身的一ç§å¸¸è§æ–¹æ³•æ˜¯åœ¨åŒä¸€çº§åˆ«å…·æœ‰åŒå的模å—和类型(而ä¸æ˜¯åƒç¤ºä¾‹ä¸­é‚£æ ·åœ¨æ¨¡å—内部使用类型) 。例如,有一个List<'a>类型和一个List模å—,其中包å«ç”¨äºŽå¤„ç†å®ƒçš„函数的函数。与Option,Set,Resultç­‰

类似

如果您已ç»æœ‰ä¸€ä¸ªå…·æœ‰ç»™å®šå称的类型,则å¯ä»¥æ·»åŠ ä¸€ä¸ªå±žæ€§ä»¥å…许创建具有相åŒå称的模å—而ä¸ä¼šå‡ºçŽ°ç¼–译器错误:[<CompilationRepresentation(CompilationRepresentationFlags.ModuleSuffix)>]

然而,由于F#4.1,这是éšå«çš„。因此,定义一个与该类型å称相åŒçš„模å—,并且在编译代ç æ—¶ï¼Œå•è¯Moduleå°†ä½äºŽæ¨¡å—å称的末尾。

type System =
    { name : string
      children : System list }

module System =
    let init () = { name = ""; children = [] }

我认为这一切æ„味ç€è¿™å¯ä»¥æ˜¯åœ¨F#中使用的有效模å¼ã€‚特别是当你有一个很好的抽象。您å¯èƒ½å¸Œæœ›æŸ¥æ‰¾â€œæŠ½è±¡æ•°æ®ç±»åž‹â€ï¼Œå› ä¸ºæˆ‘认为它们适用于此处。

查看我上é¢ç»™å‡ºçš„示例,这通常更åƒæ˜¯ä¸€ä¸ªåº“级模å¼ï¼Œä½†æˆ‘å¬è¯´è¿‡å®ƒå¯ä»¥åº”用于应用程åºä»£ç ä¸­çš„良好效果。我å¯ä»¥æƒ³è±¡å®ƒå¯ä»¥å¸®åŠ©æ‚¨æ€è€ƒå’Œå®žæ–½æŠ½è±¡è¾¹ç•Œå¹¶ä¿æŒä»£ç ç»„织。