在 OOP 中,我們可以使用“介面”來要求物件實作某些方法。我認為這可以在 FP Haskell 中實作,但我很難找到一個可行的例子。
我的目標是創建一個具有一些標準化介面的工具包,以確保專案域內的兼容性和標準化。
例如,假設我的一個介面定義了一個計算器,以及它必須實作的方法;我們可以要求每個計算器實作 和 -。可以有許多不同版本的計算器,它們可以根據需要定義函式。下面是一些類似 Haskell 的代碼嘗試。
class Calculator c where
add :: (Float a) => a -> a -> a
sub :: (Float a) => a -> a -> a
instance Calculator DumbCalc where
add a b = 5
sub a b = 3
instance Calculator SmartCalc where
add a b = a b
sub a b = a - b
通過以這種方式使用介面,我可以創建一個模塊化程式,該程式利用組件而沒有硬編碼行為。在上面的例子中,我可以創建一個包含計算器的程式;將來我可以創建一個具有更高效流程的新計算器,并在不更改父程式中的邏輯的情況下實作它。
如何在 Haskell 中實作這種設計模式?
uj5u.com熱心網友回復:
如果只有操作而沒有型別,就像您的示例一樣,您更有可能將其視為資料型別。
data Calculator = Calculator {
add :: Float -> Float -> Float,
sub :: Float -> Float -> Float
}
構建一個計算器:
dumbCalc :: Calculator
dumbCalc = Calculator (\_ _ -> 5) (\_ _ -> 3)
smartCalc :: Calculator
smartCalc = Calculator ( ) (-)
你甚至可以組合計算器,這是模塊化的真正秘訣。
-- Uses both calculators and returns whichever result is smaller
leastCalc :: Calculator -> Calculator -> Calculator
leastCalc c1 c2 = Calculator (\x y -> min (add c1 x y) (add c2 x y))
(\x y -> min (sub c1 x y) (sub c2 x y))
需要計算器的函式將 aCalculator作為引數,您可以隨意將其傳遞給它們。
如果除了函式之外還抽象了型別,那么像這樣的資料型別模塊化就不能很好地作業。在這種情況下,合適的工具是型別類,因為這通常是型別類的重點,我將讓您閱讀網上無數可用資源中的那些。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/487877.html
標籤:哈斯克尔
上一篇:使用foldl計算產品總和
