-1

我是 Haskell 的新手,我无法弄清楚如何声明“数据”类型以及如何使用该类型初始化变量。我还想知道如何更改该变量的某些成员的值。例如:

data Memory a = A 
  { cameFrom :: Maybe Direction
  , lastVal :: val
  , visited :: [Direction]
  }

Direction 是一个包含 N,S,E,W 的数据类型 val 是一个 int 类型

init :: Int -> a
init n = ((Nothing) n []) gives me the following error:


The function `Nothing' is applied to two arguments,
but its type `Maybe a0' has none
In the expression: ((Nothing) n [])
In an equation for `init': init n = ((Nothing) n [])

我怎样才能解决这个问题 ?

更新:做到了,非常感谢,但现在我有另一个问题

move :: val -> [Direction] -> Memory -> Direction
move s cs m | s < m.lastVal = m.cameFrom
            | ...

这给了我以下错误:

 Couldn't match expected type `Int' with actual type `a0 -> c0'
    Expected type: val
      Actual type: a0 -> c0
    In the second argument of `(<)', namely `m . lastVal'
    In the expression: s < m . lastVal

更新2:再次,这对我有很大帮助,非常感谢

另外,我还有一个问题(抱歉打扰了)

我如何只处理一个类型的元素例如,如果我有

Type Cell = (Int, Int)
Type Direction = (Cell, Int)

如果我想将 Cell 变量与 Direction 变量的 Cell 元素进行比较,我该如何进行?

4

2 回答 2

2

至于更新。语法

m.lastVal

m.cameFrom

不是你想要的。反而

move s cs m | s < lastVal m = cameFrom m

访问器只是函数,因此以前缀形式使用。Haskell 中的.用于命名空间解析(不依赖于路径)和函数组合

(.) :: (b -> c) -> (a -> b) -> a -> c
(.) f g x = f (g x)
于 2012-04-10T17:22:22.033 回答
1

初始化:

init :: Int -> Memory Int
init n = A {cameFrom = Nothing, lastVal = n, visited = []}

更改值:严格来说,您不会更改值,而是返回另一个不同的值,如下所示:

toGetBackTo :: Direction -> Memory a -> Memory a
toGetBackTo dir memory = memory {cameFrom = Just dir, visited = dir : visited memory}
于 2012-04-10T16:39:16.937 回答