gpt4 book ai didi

haskell - 我怎样才能给这个子函数一个显式类型?

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

我有以下haskell代码来扩展字符串中的环境变量(省略解析代码):

import Control.Monad (liftM)

data Token = Literal String | EnvReference String deriving Show

expandTokens :: (Monad m) => (String -> m (Maybe String)) -> [Token] -> m String
expandTokens getEnv toks = liftM concat (mapM toString toks) where
toString (Literal s) = return s
toString (EnvReference v) = liftM (maybe "" id) (getEnv v)

(它旨在与 getEnv 的 IO 实现一起使用,但我认为如果它可以与任何 monad 一起使用,它会更适合测试)

写的时候,我试着给嵌套的 toString函数显式类型:
toString :: Monad m => Token -> m String

但是 ghc 说:
Sample.hs:8:58:
Could not deduce (m ~ m1)
from the context (Monad m)
bound by the type signature for
expandTokens :: Monad m =>
(String -> m (Maybe String)) -> [Token] -> m String
( ... )

我知道 expandTokens 中的“Monad m”必须完全相同 mtoString 的类型(因为它引用了包含函数的 getenv),但我不知道如何为 toString 编写显式类型尊重这一点 - 我认为没有任何方法可以引用不同类型声明中的任何内容,甚至可以做到吗?

最佳答案

我认为您正在寻找 ScopedTypeVariables .我从来没有用过它,但它看起来是正确的。

关于haskell - 我怎样才能给这个子函数一个显式类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12530913/

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