Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell 如何在实例函数中专门化参数/数据类型?(哈斯克尔)_Haskell - Fatal编程技术网

Haskell 如何在实例函数中专门化参数/数据类型?(哈斯克尔)

Haskell 如何在实例函数中专门化参数/数据类型?(哈斯克尔),haskell,Haskell,我已经定义并正在实现一个类来帮助测试通常执行文件系统IO的函数。按照合理的标准,我已经声明IO是这个类的一个实例,并定义了一个新的Monad,以在测试时保持假文件系统数据的状态。我要测试的函数可以在IO中运行,也可以在这个新的FSStateMonad中运行。伪文件系统数据本身保存在我调用的对象中FSState 通常情况下,最复杂的情况是:withFile采用路径、一个IOMode和一个处理函数,该函数处理打开的文件,并调用一个函数将数据附加到相关文件中。问题在最后出现,因为在句柄名义上关闭之后,

我已经定义并正在实现一个类来帮助测试通常执行文件系统IO的函数。按照合理的标准,我已经声明IO是这个类的一个实例,并定义了一个新的
Monad
,以在测试时保持假文件系统数据的状态。我要测试的函数可以在IO中运行,也可以在这个新的
FSStateMonad
中运行。伪文件系统数据本身保存在我调用的对象中
FSState

通常情况下,最复杂的情况是:
withFile
采用路径、一个
IOMode
和一个处理函数,该函数处理打开的文件,并调用一个函数将数据附加到相关文件中。问题在最后出现,因为在句柄名义上关闭之后,我需要对状态进行一些后处理。此时,我遇到了将类函数中的变量专门化为伪文件系统monad中所需类型的问题

我希望这里有足够的代码来说明正在发生的事情和我采取的方法。实际上通过
堆栈
进行语法检查和加载的完整示例如下

newtype HandleMap=HandleMap(映射字符串BSL.ByteString)派生Show
newtype FileMap=FileMap(映射字符串BS.ByteString)派生Show
数据FSState=FSState{u handles::HandleMap
,_文件::文件映射
}派生(显示)
类Monad m=>MonadWriteHandler m,其中
MWM型手柄
MWM型
withFile::FilePath->IOMode->(MWHandle m->m r)->m r
hPutBSL::MWHandle m->BSL.ByteString->m(MWResult m)
实例MonadWriteHandler FSStateMonad,其中
类型MWHandle FSStateMonad=FSHandle
类型MWResult FSStateMonad=FSState
hPutBSL(FSHandle h)bs=返回$FSState{u files=mempty
,_handles=HandleMap$M.fromList[(h,bs)]]
withFile path WriteMode handler=do
完成状态
closeHandles-FSState{u-files=fs,{u-handles=hs}=FSState{u-files=fs-closeFSHandles-hs,{u-handles=mempty}
哪里
closeFSHandles(HandleMap hm)=文件映射$M.map BSL.toStrict hm
我希望能够从
withFiles
定义中调用
FSStateMonad
closeHandles
,但编译器不喜欢它。在上面的例子中,错误消息抱怨它需要类型注释,因为
completed
的类型不明确,但当我提供类型注释时,它不喜欢它,即使
type mwresult FSStateMonad
是实例中定义的
FSState
。如果我使用在任何实例之外定义的
closeHandles
版本,它会抱怨,因为
completed
必须是
r
类型,而不是
FSState
。我还尝试用file函数专门定义实例的
,但没有成功


我有一种感觉,我要么是以某种无意中被打破的方式来处理这个问题,要么就是我缺少了一种基本的语言技巧。我很感激你的指导

嗯,要点对我来说是这样的。。。我又查了一遍。我正在通过堆栈使用ghci 8.6.4。我不想让任何人浪费时间!我将精简堆栈设置并发布整个最小目录,我还将探索
ScopedTypeVariables
提供了什么--谢谢!嗯,要点现在起作用了,我没有安装软件包。啊!我刚刚用一个包含在堆栈下工作所需的额外文件的链接替换了gist;)简单看一下,您的
with file
似乎太具体了,因为它不适用于任意返回类型
r
,而只适用于
r=FSState
。您的
FSStateMonad
被定义为身份单子,因此我不确定您计划如何携带状态(看起来不可行)。我希望有一些定义,比如
Control.monad.state
中的state monad。谢谢!我会再看一遍,看看这个。嗯,我的要点是这样的。。。我又查了一遍。我正在通过堆栈使用ghci 8.6.4。我不想让任何人浪费时间!我将精简堆栈设置并发布整个最小目录,我还将探索
ScopedTypeVariables
提供了什么--谢谢!嗯,要点现在起作用了,我没有安装软件包。啊!我刚刚用一个包含在堆栈下工作所需的额外文件的链接替换了gist;)简单看一下,您的
with file
似乎太具体了,因为它不适用于任意返回类型
r
,而只适用于
r=FSState
。您的
FSStateMonad
被定义为身份单子,因此我不确定您计划如何携带状态(看起来不可行)。我希望有一些定义,比如
Control.monad.state
中的state monad。谢谢!我将再次着眼于这一点来审视它。