2017-06-21 74 views
0

我正在讀「Scala中的函數式編程」一書,並正在編寫單元測試來檢查練習的實現。Scala中的函數式編程:如何單元測試函數組合

我不確定自己理解的一件事是如何使用函數組合和狀態通道進行單元測試練習,在本書的第6章中進行了解釋。

例如一個鍛鍊(如本書的6.8。)是關係到使用狀態的通道功能flatMap的實施,解決方案如下:

def flatMap[A, B](f: Rand[A])(g: A => Rand[B]): Rand[B] = { 
    rng => { 
    val (a, rng2) = f(rng) 
    g(a)(rng2) 
    } 
} 

現在,我明白了實施的解決方案,但我無法弄清楚如何爲它編寫單元測試。 詳細地說,我知道如何通過Rand [A]作爲函數f的參數,但我不知道如何構建函數g,它應該返回Rand [B]。

有沒有人想出了一個解決方案呢?

在此先感謝。

+0

是你有關測試溶液或使用溶液質疑B? – pedrofurla

+0

Hi @pedrofurla:測試解決方案。 – mtraina

回答

0

如果你想實現一個功能A => Rand[B]接受一個A並返回一個Rand[B],你只需要

  1. 一種創建一個Rand[B](其中這被定義爲一個別名RNG => (B,RNG))。您可以明確地執行此操作(通過創建RNG並定義該函數),或者可以使用返回Rand[B](如unit,map,...)的其他函數。
  2. 邏輯,以產生從A

    val g: RNG = // ... 
    val ra: Rand[Int] = // ... you know how to build it, you say 
    val rb: Rand[String] = flatMap(ra)(n => unit("hello")) // E.g., you ignore 'n' 
    rb(g)._1 shouldEqual "hello" 
    
+0

完美答案,謝謝。 – mtraina

相關問題