gpt4 book ai didi

haskell "Could not deduce", "Non type-variable argument"

转载 作者:行者123 更新时间:2023-12-01 13:12:37 26 4
gpt4 key购买 nike

来 self 的 previous question ,我一直在尝试制定一些单子(monad)代码。首先,这是我正在使用的状态机函数:

import Control.Monad
import Control.Monad.Error

newtype FSM m = FSM { unFSM :: String -> m (String, FSM m) }

fsm f [] = return []
fsm f (r:rs) = do
(xs, f') <- unFSM f r
liftM (xs:) (fsm f' rs)

现在,编译正常了:

exclaim :: (Monad m) => FSM m
exclaim = FSM exclaim'
exclaim' xs = return (xs ++ "!", exclaim)

但这不是,因为类型声明:

question :: (MonadError String m) => FSM m
question = FSM question'
question' xs
| last xs == '?' = throwError "Already a question"
| otherwise = return (xs ++ "?", question)

错误是Non type-variable argument,我认为是指MonadError之后的String。如果删除类型声明,则会得到 Could not deduce。我知道启用 FlexibleContexts 只是“修复”了这个问题,但是我可以做一些更简单的事情来让我抛出错误吗?我宁愿不启用各种编译器扩展。

完整代码 here .

最佳答案

如果您绝对不想使用FlexibleContextsNoMonomorphismRestriction,您可以制作questionquestion' 更通用一点,使其在不打开模块中的扩展的情况下编译:

question :: (Error e, MonadError e m) => FSM m
question = FSM question'

question' :: (Error e, MonadError e m) => String -> m (String, FSM m)
question' xs
| last xs == '?' = throwError $ strMsg "Already a question"
| otherwise = return (xs ++ "?", question)

使用 strMsg 让它抛出一个通用的 Error 类型,并指定类型签名。

不过,我还是更喜欢启用 FlexibleContexts

关于 haskell "Could not deduce", "Non type-variable argument",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15505683/

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