我有這樣一組函數:哈斯克爾 - 型包裝統一
f1 :: String -> String -> ... -> String ->()
f1 a b ... z = g [("a", a), ("b", b), ... ("z", z)]
...
fn :: String -> Int -> String -> ... -> String ->()
fn a b ... z = g [("a", a), ("b", show b), ... ("z", z)]
所以用戶可以叫他們像f1 "abc" "def"
。我不希望他這樣做,因爲他可以輕鬆地交換「abc」和「def」(並且上帝知道調試時會浪費多少時間)。我希望他來傳遞參數一樣fk (A "abc") (B "def")
據我所看到的,有2個選項:
大規模
data
建設和大規模的解壓功能:data Value = A String | B String | C Int | D String ... unpack :: Value -> String unpack (A a) = a unpack (B b) = b unpack (C c) = show c unpack (D c) = d
大量的代碼。
常見的類型和新類型:
編輯:好的,那麼,我們可以在這種簡單的情況下使用GeneralizedNewtypeDeriving
。{-# LANGUAGE GeneralizedNewtypeDeriving #-} class Value a where unpack :: a -> String instance Value String where unpack = id instance Value Int where unpack = show newtype A = A String deriving Value newtype B = B String deriving Value newtype C = C Int deriving Value newtype D = D String deriving Value ...
看起來好多了,但所有
fk
會是什麼樣子fk a b ... z = g [("a", unpack a), ("b", unpack b), ... ("z", unpack z)]
大量的代碼和重複。
我想要的是一些魔術這將讓我:
fk a b ... z = g [("a", a), ("b", b), ... ("z", z)]
g = h . map (second unpack)