在Haskell函数中访问fromList,而不在函数声明中包含类型吗?如果可以,如何正确使用它



我有一个函数声明:

iexec :: Instr -> Config -> Config
iexec (LOADI x) (counter, memory, stack) = (counter+1, memory, x:stack)

其中Instr和Config是新的类型类。我想这样工作:

>iexec (LOADI 5) (0, empty, [])
>(1, fromList [], [5])

我的问题是,我不知道如何返回内存的fromList,其他一切都在工作。我试着做

iexec (LOADI x) (counter, memory, stack) = (counter+1, Map.fromList memory, x:stack)

然而,我遇到了一个错误,根据输入的不同而有所不同,但它基本上可以归结为我不知道该功能的正确语法,或者我无法访问函数中的fromList。任何能给我指明正确方向的东西都会很有帮助,谢谢。

编辑:按要求:

type Config = (Int, [Val] ,[Val])

其中CCD_ 1是CCD_。仅使用内存时的错误消息为:

error:
• Variable not in scope: empty :: [Val]
• Perhaps you meant ‘mempty’ (imported from Prelude)
|
9 | main = print (iexec (LOADI 5) (0, empty, []))

如果您编写的类型签名表明您返回了一个列表,那么您就不能返回映射。因此,标题中的问题的答案是";不,你不能那样做&";。

备选方案有多种选择。一种方法是将Config类型参数化。假设您已经将您最喜欢的地图实现模块导入为M,那么它看起来是这样的:

type Config2 f = (Int, f Val, [Val])
iexec2 :: Instr -> Config2 [] -> Config2 (M.Map Int)
iexec2 (LOADI x) (counter, memory, stack) = (counter+1, M.fromList (zip [0..] memory), x:stack)
main = print (iexec2 (LOADI 5) (0, [], []))

另一种选择是只需将Config类型更改为始终为地图:

type Config3 = (Int, M.Map Int Val, [Val])
iexec3 :: Instr -> Config3 -> Config3
iexec3 (LOADI x) (counter, memory, stack) = (counter+1, memory, x:stack)
main = print (iexec3 (LOADI 5) (0, M.empty, []))

还有更多的选择,但我认为这两个是最干净的。

找到并理解的答案:

类型配置应为(Int,State,Stack(,其中State和Stack为:

type State = Map Vname Val
type Stack = [Val]
type Config = (Int, State, Stack)

因此,config可以被放入iexec函数中,并且使用Data.Map功能,可以使用Val和Vname变量,并且当State被用作";存储器";并且已经是Map。

相关内容

最新更新