2016-04-04 62 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

相关问题