有没有办法在haskell中转换函数类型?

时间:2016-04-04 02:55:08

标签: haskell type-conversion

我对haskell相当新,我遇到了转换函数类型的问题。假设我对函数类型以外的函数一无所知。是否可以转换其功能类型并将其作为新功能。 例如

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

有办法做这样的事吗?

2 个答案:

答案 0 :(得分:2)

提示:

  • (Int -> Int -> Int) -> (Integer -> Integer -> Integer)也可以写成(Int -> Int -> Int) -> Integer -> Integer -> Integer。它是三个参数的函数。

  • Converting Numbers

答案 1 :(得分:2)

正如其他人已经解释的那样,你想要的基本上是这样的:

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

这非常简单。但是,如果我这样做,我将利用on中的Data.Function函数,该函数在应用之前转换带有两个参数的函数的输入。所以,在你的例子中,它看起来像这样:

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

无论如何,我希望这有点有用。

我真的不是因为这篇文章恐吓你作为一个新人,所以如果其中任何一个让你困惑,请问我问题,我很乐意回答:)