【问题标题】:selecting the tail of a list of tuples in haskell在haskell中选择元组列表的尾部
【发布时间】:2014-04-16 12:52:58
【问题描述】:

我有以下代码:

type DecV = [(Var,Aexp)]

d_v_ds :: DecV -> (EnvV, Store) -> (EnvV, Store)
d_v_ds [] (envV, sto) = (envV, sto)
d_v_ds [(v, xAexp)] (envV, sto) = do
                d_v_ds (tail ([(v, xAexp)])) (envV', sto')

当我尝试运行它时,我得到一个非详尽的模式错误。我已尝试将功能更改为:

d_v_ds :: DecV -> (EnvV, Store) -> (EnvV, Store)
d_v_ds [] (envV, sto) = (envV, sto)
d_v_ds [(v, xAexp): a] (envV, sto) = do
                    d_v_ds (a) (envV', sto')

函数无法编译。我怎样才能做到这一点? 谢谢

【问题讨论】:

  • envV'sto' 是从哪里来的?

标签: haskell recursion tail


【解决方案1】:

正如编译器所说,您的模式匹配是不完整的,这意味着从某种意义上说,输入的所有可能变化都没有被捕获。

假设我们要实现以下功能:

aFunc :: [a] -> b

考虑以下模式匹配:

-- Matches an empty list
aFunc [] = ...

-- Matches anything
aFunc x = ...

--Matches one member list
aFunc [x] = ...

-- Matches a two member list
aFunc [x,y] = ...

-- Matches a list with atleast one member
aFunc (x:xs) = ...

-- A mutually exhaustive set
aFunc [] = ...
aFunc (x:xs) = ...

此外,模式是按顺序匹配的,因此为了便于设计,通常请确保您的模式匹配集相互详尽,并将基本案例定义保留为第一个。

在您的情况下,您应该将函数修改为:

d_v_ds :: DecV -> (EnvV, Store) -> (EnvV, Store)
d_v_ds [] (envV, sto) = (envV, sto)
d_v_ds ((v, xAexp): xs ) (envV, sto) = d_v_ds xs (envV', sto')

但是,请注意 envV' 尚未定义。而且这个函数似乎最终只会返回您在初始调用中提供的第二个参数。

【讨论】:

    【解决方案2】:

    问题在于您的函数d_v_ds 没有考虑具有许多元素的列表,而只考虑了空列表[] 和具有一个元素的列表[(v, xAexp)]。我认为您误解了 Haskell 语法,因为您使用 tail [(v,xAexp)] 来获取一个元素列表的尾部。 我不知道 envV'sto' 是什么,但如果我理解正确你想要做什么,那就是处理列表的每个元素,你的函数可以重写:

    d_v_ds :: DecV -> (EnvV, Store) -> (EnvV, Store)
    d_v_ds []              (envV, sto) = (envV, sto)
    d_v_ds ((v, xAexp):xs) (envV, sto) = d_v_ds xs (envV', sto')
    

    匹配 ((v,xAexp):xs) 包含您需要的所有内容:(v,xAexp) 是列表的头部,xs 是列表的尾部,(v,xAexp):xs 表示您正在等待由至少一个元素组成的列表(xs 可以为空)。

    【讨论】:

    • 请注意,[(v,xAexp):a] 未编译,因为它的类型为 [[(Var,Aexp)]] 而不是 [(Var,Aexp)]。正确的语法是没有[] 并被() 包围,如((v,xAexp):a)
    【解决方案3】:

    试试这个:

    d_v_ds [] (envV, sto) = (envV, sto)
    d_v_ds (_:rst) (envV, sto) = d_v_ds rst (envV', sto')
        where envV' = ...
              sto' = ...
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-03-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-11
      相关资源
      最近更新 更多