2017-04-18 86 views
0

我想要熟悉Haskell,我在想如果下面是可能的,如果是這樣,怎麼樣?在haskell中替換複合函數中的函數

說我有一套功能{f,g,..}爲此我要定義一個替代函數{f',g',..}。現在說我有一個函數c,它使用這些函數(並且只有這些函數)在它自己內部,例如c x = g (f x)。有沒有一種方法可以自動定義c' x = g' (f' x)而不明確定義它?

編輯:通過替換函數f'我的意思是一些函數,在概念上與f通過以某種任意方式被改變。例如,如果f xs ys = (*) <$> xs <*> ys然後f' (x:xs) (y:ys) = (x * y):(f' xs ys)

非常感謝, 本

+1

你是什麼意思的「替代功能」?你能舉一個更具體的例子嗎?但是,我會猜測答案可能是「不是沒有一些重構」。如果你能以某種方式讓'f','g'和co在一個類型類型下生活,那麼你可以重寫所有'c'函數來使用該類型類型。或者,您可以通過創建一個數據類型進行顯式傳遞,該數據類型包含您要使用的每個函數的字段。可能還有一個模板haskell解決方案,但我很少建議TH,除非沒有其他方法。 – bheklilr

+0

你能詳細解釋一下類型類方法嗎?我認爲我會有一個帶有函數的類型類型,並以我想要的方式生成另一個函數,但是如何使用它來生成'c''? – BenJacob

+0

也許從'自動分化'的想法可以幫助你。 – freestyle

回答

1

如果象似乎與你的情況爲例,ff'有相同的類型等,那麼你可以很容易地通過他們作爲額外的參數。像

cGen :: ([a] -> [a] -> [a]) -> (([a] -> [a]) -> b) -> [a] -> b 
cGen f g x = g (f x) 

...這BTW也可以寫cGen = (.) ...

如果你想一起特殊羣體「的函數集」,你可以做到這一點與「配置型」

data CConfig a b = CConfig { 
     f :: [a] -> [a] -> [a] 
    , g :: ([a] -> [a]) -> b 
    } 

cGen :: CConfig a b -> [a] -> b 
cGen (CConfig f g) = f . g 
0

最簡潔和可靠的方法,這樣做將與RecordWildCards

data Replacer ... = R {f :: ..., g :: ...} 

c R{..} x = g (f x) 

現在,您的函數集現在從本地範圍從記錄中拉出,而不是全局定義,並且可以根據您的判斷將其替換爲一組不同的函數。

接近你想要的東西的唯一方法是使用模板哈斯克爾解析源代碼並對其進行修改。普通的Haskell代碼根本無法以任何方式檢查函數 - 這會違反引用透明性。