gpt4 book ai didi

haskell - 如何将一元函数作为带有灵活类型变量的参数传递?

转载 作者:行者123 更新时间:2023-12-02 13:51:39 33 4
gpt4 key购买 nike

对可能含糊的问题标题表示歉意 - 我不知道如何表达它,因为我对问题是什么了解甚少。

基本上,我如何进行以下编译? :-p

{-# LANGUAGE MultiParamTypeClasses #-}

class (Monad m) => MyClass m a where
valM :: m (Maybe a)
val :: m a

f :: (MyClass m a) => (m a -> IO a) -> IO (a, Maybe a)
f g = do
x <- g val
yM <- g valM
return (x, yM)

GHC (v8.2.2) 提示 a 是一个刚性类型变量,似乎无法处理 (g val) 的想法(g valM) 可以产生不同类型的值。我尝试过使用 RankNTypes 但无济于事。

是否有一个扩展可以用来帮助编译器,或者从类型推断的角度来看,我想要做的事情在概念上是否有问题?

最佳答案

您是对的,您需要 RankNTypes,但您缺少 forallf 的正确类型是:

f :: MyClass m a => (forall b. m b -> IO b) -> IO (a, Maybe a)

…因为传递给 f 的函数必须适用于任何结果类型,并且它不应该与结果中的 a 相关。

<小时/>

还值得注意的是,这种函数也称为自然变换,自然变换包提供 a (~>) type alias对于此类功能:

type (~>) f g = forall a. f a -> g a

因此,使用该类型别名,您也可以这样编写 f:

f :: MyClass m a => (m ~> IO) -> IO (a, Maybe a)

关于haskell - 如何将一元函数作为带有灵活类型变量的参数传递?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48053237/

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