我對haskell相當陌生,遇到這種類型轉換函數的問題。假設我對功能類型以外的功能一無所知。是否有可能轉換其功能類型並將其作爲新功能。 例如有沒有辦法在haskell中轉換函數類型?
myfunc:: (Int -> Int -> Int) -> (Integer -> Integer -> Integer)
myfunc inputfunc = (function with type (Integer -> Integer -> Integer))
有沒有辦法做這樣的事情?
我對haskell相當陌生,遇到這種類型轉換函數的問題。假設我對功能類型以外的功能一無所知。是否有可能轉換其功能類型並將其作爲新功能。 例如有沒有辦法在haskell中轉換函數類型?
myfunc:: (Int -> Int -> Int) -> (Integer -> Integer -> Integer)
myfunc inputfunc = (function with type (Integer -> Integer -> Integer))
有沒有辦法做這樣的事情?
正如已經被別人解釋,你想要的東西基本上是這樣的:
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
無論如何,我希望這是有點用的。
我真的不是故意的這個職位,你恐嚇做爲一個新人,所以如果它的任何混淆了你,請你問我問題,我會高興地回答:)
提示:
(Int -> Int -> Int) -> (Integer -> Integer -> Integer)
也可以寫成(Int -> Int -> Int) -> Integer -> Integer -> Integer
。它是三個參數的函數。
我看鏈接,轉換基本上要求我們事先知道功能。如果inputfunc是一個我們不知道的黑盒函數,我們仍然可以轉換這樣的函數嗎? – user3595342
@ user3595342作爲三個參數的函數重寫'myfunc'。創建參數來提供inputfunc,然後處理它的輸出。 – PyRulez
從'詮釋轉換 - >詮釋 - > Int'到Integer - > Integer - > Integer'通常是不安全的,因爲它意味着有人可以將一個參數傳遞給超出'Int'範圍的新函數。 – Ryan
但讓我們說如果我只想轉換,並不在乎「安全」。是否存在從積分(從積分x到積分y)轉換 – user3595342
'的方法' – user2407038