我只是哈斯克尔单子玩弄和我不断收到,我似乎无法修复的错误。我的代码段使用状态Monad将字符串中的前两个字符添加到一起,并将它们作为状态的一部分返回。我的“放”行不断给我的错误:也能收到(使用FlexibleContexts允许此)错误在简单的Haskell功能
* Non type-variable argument in the constraint: MonadState [a] m
(Use FlexibleContexts to permit this)
* When checking the inferred type
testH :: forall (m :: * -> *) a. MonadState [a] m => [a] -> m [a]
我怎样才能解决这个问题?扩展语言是不是一种选择,我只需要知道我可以改变我的代码来得到它的工作
test xs =
runState (testH (tail xs)) ((head xs):[])
testH xs =
do
a <- get
put ((head xs):a)
b <- get
return b
你导入'Control.Monad.State'?如果是这样,请尝试导入“Control.Monad.Trans.State”。 – Alec
我并不完全相信,我知道你的意思是“扩展语言不是一种选择”。如果你只是在玩monads,为什么不在你的代码的顶部添加'{ - #LANGUAGE FlexibleContexts# - }'? – Lazersmoke
“扩展的语言是不是一种选择”,除非你正在使用'MultiParamTypeClasses'单单是'MonadState'的范围,因此已经扩展了语言。 –