我对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