gpt4 book ai didi

haskell - 可以在 newtype 定义中使用 typeclass 约束吗?

转载 作者:行者123 更新时间:2023-12-01 07:24:20 25 4
gpt4 key购买 nike

假设我们有以下 newtype定义:

newtype A = A { _run :: Monad m => A -> [Int] -> m Int }

这不能用 GHC 8.0.2 编译:
error: Not in scope: type variable ‘m’

更换 m具有像 IO 这样的具体类型类或 []正如我所期望的那样编译。鉴于这是可以的,为什么 GHC 不允许上面的签名?在此 newtype 中添加类型类约束有什么问题? ?

最佳答案

这取决于您要在 A 中存储的内容.

如果你想存储任何类似的函数,只要 mMonad ,将其用作类型参数,并在您的函数中指定此约束:

newtype A m = A { _run :: A m -> [Int] -> m Int }

myFunction :: Monad m => A m -> A m

然后你可以有类似 A [] -> [Int] -> [Int] 的东西或 A Maybe -> [Int] -> Maybe Int在构造函数里面。
f :: A Maybe -> [Int] -> Maybe Int
f _ (x:_) = Just x
f _ [] = Nothing

g :: Monad m => A m -> [Int] -> m Int
g _ xs = return $ head xs

myA :: A Maybe
myA = A f -- this works

myOtherA :: Monad m => A m
myOtherA = A g -- this works too

另一方面,如果你想强制你存储的数据是多态的,你可以使用 GHC 扩展 RankNTypes .
{-# LANGUAGE RankNTypes #-}
newtype A = A { _run :: forall m. Monad m => A -> [Int] -> m Int }

myFunction :: A -> A

你不可能有 A -> [Int] -> [Int] 之类的东西或 A -> [Int] -> Maybe Int在构造函数中,因为 forall强制他们在 任何 Monad m ,所以它必须是 Monad m => A -> [Int] -> Maybe Int 类型.
f :: A -> [Int] -> Maybe Int
f _ (x:_) = Just x
f _ [] = Nothing

g :: Monad m => A -> [Int] -> m Int
g _ xs = return $ head xs

myA :: A
myA = A f -- this does not work ; it wants forall m. Monad m => m, not []

myOtherA :: A
myOtherA = A g -- this does work

如果您打算使用不同的特定 Monad,这只会真正有用。 A 的实例-值(value)。例如,镜头通过使用不同的仿函数对镜头做不同的事情来以这种方式工作。

关于haskell - 可以在 newtype 定义中使用 typeclass 约束吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43444170/

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