«Узел применяется к слишком малому количеству аргументов», хотя существует точное число - PullRequest
0 голосов
/ 17 апреля 2019

s и a являются переменными типа. В конструкторе первые два параметра - это данные, затем его родитель, уровень в графе и список его потомков.

data Node s a = Root | Node s a (Node s a) Int [Node s a]
createRoot :: (ProblemState s a) => s-> a -> Node s a
createRoot state act= Node (state act Root 0 [])

И я передал точно такое же количество 5 аргументов конструктору Node, однако я получаю ошибки.

• Couldn't match expected type ‘Node s a’
              with actual type ‘a1
                                -> Node s1 a1 -> Int -> [Node s1 a1] -> Node s1 a1’
• Probable cause: ‘Node’ is applied to too few arguments
  In the expression: Node (state act Root 0 [])
  In an equation for ‘createRoot’:
      createRoot state act = Node (state act Root 0 [])
• Relevant bindings include
    act :: a (bound at Search.hs:43:24)
    state :: s (bound at Search.hs:43:18)
    createRoot :: s -> a -> Node s a (bound at Search.hs:43:1)

1 Ответ

7 голосов
/ 17 апреля 2019

Скобки используются для группировки выражений.(length "hello" + 2) - это одно значение, а не 4.

Аналогично, Node (...) применяет Node к одному аргументу: (state act Root 0 []).Очевидно, что это неправильно (и потребовалось бы, чтобы state была функцией, принимающей четыре аргумента).

Решение состоит в том, чтобы просто удалить скобки:

Node state act Root 0 []

Теперь Node применяется кпять аргументов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...