2016-04-04 90 views
1

我對haskell相當陌生,遇到這種類型轉換函數的問題。假設我對功能類型以外的功能一無所知。是否有可能轉換其功能類型並將其作爲新功能。 例如有沒有辦法在haskell中轉換函數類型?

myfunc:: (Int -> Int -> Int) -> (Integer -> Integer -> Integer) 
myfunc inputfunc = (function with type (Integer -> Integer -> Integer)) 

有沒有辦法做這樣的事情?

+1

從'詮釋轉換 - >詮釋 - > Int'到Integer - > Integer - > Integer'通常是不安全的,因爲它意味着有人可以將一個參數傳遞給超出'Int'範圍的新函數。 – Ryan

+1

但讓我們說如果我只想轉換,並不在乎「安全」。是否存在從積分(從積分x到積分y)轉換 – user3595342

+3

'的方法' – user2407038

回答

2

正如已經被別人解釋,你想要的東西基本上是這樣的:

convert f x y = fromIntegral (f (fromIntegral x) (fromIntegral y)) 

這是非常簡單的。但是,如果我要這樣做,我會利用Data.Function中的on函數,該函數在應用它之前轉換帶有兩個參數的函數的輸入。所以,在你的榜樣,它應該是這樣的:

convert f x y = fromIntegral ((f `on` fromIntegral) x y) 

我個人而言,會多走一步,使這個功能自由點,但由於on f fromIntegral需要兩個參數,你不能只用(.) ,所以我通常定義一個操作此:

(.:) = (.) . (.) 

你能弄清楚爲什麼這個工作你自己,如果你願意,但我現在可以定義轉換爲這樣的:

convert f = fromIntegral .: (f `on` fromIntegral) 

我覺得這樣更具可讀性,但是我有點偏頗,因爲我一直在編碼Haskell這個片刻。

此外,如果你看看推斷類型這個變量,你會發現它是更普遍比你想要的東西:

convert :: (Integral a, Integral a1, Num b, Num b1) = (b1 -> b1 -> a) -> a1 -> a1 -> b 

無論如何,我希望這是有點用的。

我真的不是故意的這個職位,你恐嚇做爲一個新人,所以如果它的任何混淆了你,請你問我問題,我會高興地回答:)

2

提示:

  • (Int -> Int -> Int) -> (Integer -> Integer -> Integer)也可以寫成(Int -> Int -> Int) -> Integer -> Integer -> Integer。它是三個參數的函數。

  • Converting Numbers

+0

我看鏈接,轉換基本上要求我們事先知道功能。如果inputfunc是一個我們不知道的黑盒函數,我們仍然可以轉換這樣的函數嗎? – user3595342

+1

@ user3595342作爲三個參數的函數重寫'myfunc'。創建參數來提供inputfunc,然後處理它的輸出。 – PyRulez

相關問題