【发布时间】:2017-04-06 01:41:32
【问题描述】:
我只是在玩 Haskell monads,但我不断收到一个似乎无法修复的错误。我的代码段使用状态 Monad 将字符串中的前两个字符加在一起并将它们作为状态的一部分返回。我的“put”行不断给我错误:
* 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。 -
我不完全确定我明白您所说的“扩展语言不是一种选择”是什么意思。如果您只是在玩 monad,为什么不在代码顶部添加
{-# LANGUAGE FlexibleContexts #-}? -
“扩展语言不是一种选择”,除非您使用
MultiParamTypeClasses,只是在范围内包含MonadState,因此已经扩展了语言。
标签: haskell monads state-monad