2017-04-07 87 views
7

我被要求捕獲通過在C#中應用函數式編程原則實現的系統設計。對此的要求是使用任何形式來描述設計,而不是非正式的英語。此外,禁止使用UML。功能範例設計

我已經選擇嘗試使用F#來達到這些目的,但是我很難保持抽象級別高,而不必重新實現所有使用F#的實現。

所以,我有幾個問題:

  1. 有任何建築框架/實際中是如何描述的功能設計?

  2. 如何在沒有實現細節的情況下公開方法?

  3. 如何在F#中創建組件接口?

  4. 在OO中,您通常會有不同的建築視圖(例如4 + 1)。功能設計有沒有這樣的東西?

回答

0

對於1:不,我知道的,但我不是那種架構開發

爲2:下面是我的技術使用和想了很多。

let memoize (f : 'K -> 'V) : 'K -> 'V = 
    let dict = Dictionary<'K, 'V>() 
    fun k -> 
    match dict.TryGetValue k with 
    | true , v -> v 
    | false, _ -> 
     let v = f k 
     dict.[k] <- v 
     v 

對於3:你是什麼意思的組件接口?

對於4:4 + 1應該對函數式語言有效,並且它似乎與語言無關。一般來說,我發現功能設計更關注高階函數,數據和行爲的分離,偏好於可變性的不可變性以及提升副作用「向上」(IO Monad就是這方面的一個例子)。

1

TLDR它是所有關於構圖。

你需要使用HKT的所有東西(將它們想象成通用泛型)大多是圖書館設計的巨大財富,當你打算進行純函數式編程時,它與GO4思維模式或新的流行詞根本不同的企業編程一週。學習Haskell,學習Monads,Functors,Applicatives,Monoid等等(不要害怕你已經使用它們超過9000次而現在沒有意識到它)然後研究像Free Monad這樣的東西,鍋爐板,透鏡,Typeclasses和MTL風格的變壓器,然後你會成爲一個更好的圖書館程序員。