【问题标题】:Haskell: Assigning a value to a StringHaskell:为字符串赋值
【发布时间】:2017-01-28 14:03:14
【问题描述】:

我的任务是在 Haskell 中模仿命令式编程语言的特性。现在我正在努力为字符串赋值。关键是我必须使用 Env 和 Sigma 类型。 Env 将 String(变量名)分配给 Location Loc。 Sigma 将 Location 分配给特定值。代码如下:

type Loc = Int                 --Loc for Location
type Env =  String -> Loc 
type Sigma = Loc -> Int

assign :: String -> Int -> Env -> Sigma -> Sigma
assign name value env sig = \input -> ??

现在我不知道如何在我的程序的函数assign 中做到这一点。该函数应将字符串名称和位置 loc 存储在函数 env 中,并将相同的位置 loc 和值 val 存储在函数 sig 中,必须由整个函数'assign'返回。

用例如测试它env = \"test"->42sig= \42->6(sig 和 env 只是暂时用于测试用例)、assign "x" 45 env sig 然后 sig (env "x") 应该返回 45。如果不将 Locations 分配给 env 和 sig,我不知道你是如何管理它的。你能帮我告诉我该怎么做吗?

【问题讨论】:

  • 你能展示一下sig的实现吗?
  • @WillemVanOnsem 实施是什么意思? sig 只是函数的 Sigma 类型参数
  • 那么“那么sig (env "x")应该返回45”是什么意思
  • @leftaroundabout 哦,对了。这仅适用于测试用例。在我的问题中更正了它
  • 你的测试用例是错误的。此外,您的assign 类型签名或测试用例中的env 函数都是错误的。如果类型签名正确,您的测试用例可能类似于 let { env x = case x of { "test" -> 42; "x" -> 43 }; sig = \42 -> 6 } in let { sig2 = assign "x" 45 env sig } in sig2 (env "x")

标签: haskell


【解决方案1】:

提示:

您需要首先将input 位置与name 的位置进行比较,即env name

当它们相等时,您知道要返回的新值。

当这些位置不同时,您可以访问旧的Sigma 来检索input 位置的旧值。

【讨论】:

  • 如果你是这个意思:assign name value env sig = \inp -> (if (inp == (env s)) then val else (sig inp))。我也试过这个,但我想知道这是否正确。我的意思是字符串名称必须已经分配给 env 中的特定位置才能正确使用此功能。
  • @JohnDoe 对我来说看起来不错(除了 s 是名字)。是的,这要求name 已经被env 分配了一个位置,但是没有办法解决这个问题。通常你有一个“声明”函数,它为你提供一个新的env,为新变量分配一个新的位置。但是这个函数是为了分配给一个已经定义的变量。
  • 是的 s 只是我用于字符串的参数。我再次考虑了一下,并将其放入我的任务中,这应该是正确的解决方案。非常感谢您的帮助:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-07-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-27
  • 2014-11-22
相关资源
最近更新 更多