gpt4 book ai didi

haskell - Haskell中具有多态性的引用透明性

转载 作者:行者123 更新时间:2023-12-03 14:07:54 24 4
gpt4 key购买 nike

说我有一个功能:

f :: Int -> (Rational, Integer)
f b = ((toRational b)+1,(toInteger b)+1)

我想像这样抽象掉(+1):
f :: Int -> (Rational, Integer)
f b = (h (toRational b)
,h (toInteger b))
where h = (+1)

这显然不会起作用,但如果我指定类型签名它将起作用:
f :: Int -> (Rational, Integer)
f b = (h (toRational b)
,h (toInteger b))
where h :: Num a => a -> a
h = (+1)

假设我现在想通过将 h 作为参数传递来进一步抽象函数:
f :: Num a => Int -> (a -> a) -> (Rational, Integer)
f b g = (h (toRational b)
,h (toInteger b))
where h :: Num a => a -> a
h = g

我收到一个错误,即内部 a 与外部 a 不同。

有谁知道如何正确编写这个函数?
我想传递一个多态函数 gf并以多态方式使用它。

我现在在非常不同的项目中多次遇到这种情况,我找不到一个好的解决方案。

最佳答案

我找到了解决方案:使用 forall 量词,如下所示:

{-# LANGUAGE RankNTypes #-}
f :: Int -> (forall a. Num a=> a -> a) -> (Rational, Integer)
f b g = (h (toRational b)
,h (toInteger b))
where h :: Num a => a -> a
h = g

当然可以变成:
f :: Int -> (forall a. Num a=>a -> a) -> (Rational, Integer)
f b g = (g (toRational b)
,g (toInteger b))

关于haskell - Haskell中具有多态性的引用透明性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14865734/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com