gpt4 book ai didi

haskell - 自然变换作为 Haskell 中的一个论点

转载 作者:行者123 更新时间:2023-12-03 09:59:44 27 4
gpt4 key购买 nike

我正在寻找一种将自然变换定义为传递给函数的简单参数的方法。

让我们以一个简单的函数为例:

mapK :: (m Int -> IO Int) -> Kleisli m Bool Int -> Kleisli IO Bool Int
mapK toIO kleisli = Kleisli (\bool -> toIO $ runKleisli kleisli bool)

整洁,但如果我将其更改为:
mapK :: (m a -> IO a) -> Kleisli m Bool Int -> Kleisli IO Bool Int
mapK toIO kleisli = Kleisli (\bool -> toIO $ runKleisli kleisli bool)

我得到的错误是 Int不是 a (这并不奇怪)。

我知道可以使用以下约束来实现它:
class NaturalTransformation f g where
transform :: f a -> g a

mapK :: (NaturalTransformation m IO) => Kleisli m Bool Int -> Kleisli IO Bool Int

但我很好奇是否也可以用简单的参数来做到这一点。

最佳答案

当然,您只需要要求实现者而不是调用者来选择变量:

{-# LANGUAGE RankNTypes #-}
mapK :: (forall a. m a -> IO a) -> Kleisli m Bool Int -> Kleisli IO Bool Int
-- implementation is exactly as before
mapK toIO kleisli = Kleisli (toIO . runKleisli kleisli)
-- OR, with TypeApplications also on,
mapK toIO = coerce @(_ (Bool -> _ Int)) (toIO.)

关于haskell - 自然变换作为 Haskell 中的一个论点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57467085/

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