我对haskell相当新,我遇到了转换函数类型的问题。假设我对函数类型以外的函数一无所知。是否可以转换其功能类型并将其作为新功能。 例如
myfunc:: (Int -> Int -> Int) -> (Integer -> Integer -> Integer)
myfunc inputfunc = (function with type (Integer -> Integer -> Integer))
有办法做这样的事吗?
答案 0 :(得分:2)
提示:
(Int -> Int -> Int) -> (Integer -> Integer -> Integer)
也可以写成(Int -> Int -> Int) -> Integer -> Integer -> Integer
。它是三个参数的函数。
答案 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
无论如何,我希望这有点有用。
我真的不是因为这篇文章恐吓你作为一个新人,所以如果其中任何一个让你困惑,请问我问题,我很乐意回答:)