LINUX.ORG.RU

Не могу осилить

 ,


0

2

Вроде бы простой код

data Tree a = EmptyTree | Node a (Tree a) (Tree a) deriving (Show)
treeToList :: Tree a -> [a]
treeToList EmptyTree = []
treeToList (Node a left right) = a : (treeToList left) : (treeToList right)
Выдает ошибку
Couldn't match expected type `a' with actual type `[a]'
  `a' is a rigid type variable bound by
      the type signature for treeToList :: Tree a -> [a]
      at Trees.hs:20:15
In the return type of a call of `treeToList'
In the first argument of `(:)', namely `(treeToList left)'
In the second argument of `(:)', namely
  `(treeToList left) : (treeToList right)'
Не пойму что тут не так.

treeToList (Node a left right) = a : (treeToList left) : (treeToList right)

Наверное ты хотел сказать:

treeToList (Node a left right) = a : (treeToList left) ++ (treeToList right)
Sectoid ★★★★★ ()

(treeToList left) - список, и (treeToList right) - список, а (:) - операция добавления одного элемента в список.

postman_ ★☆ ()

a : (treeToList left) : (treeToList right)

a : [a] → [a], [a] : [a] → WTF

PolarFox ★★★★★ ()

Тонны нефти вам, теперь я понял. Но как же это сложно.

Majesty911 ()
rm: невозможно сменить каталог с `/' на `lost+found': Permission denied 
rm: невозможно удалить `//var/lib/rpm/Requirename': Permission denied 
rm: невозможно удалить `//var/lib/rpm/Packages': Permission denied 
rm: невозможно удалить `//var/lib/rpm/Pubkeys': Permission denied 
rm: невозможно удалить `//var/lib/rpm/Basenames': Permission denied 
rm: невозможно удалить `//var/lib/rpm/Name': Permission denied 
Black_Shadow ★★★★★ ()
Ответ на: комментарий от grouzen

Эй, все когда-то начинали с нуля.

А то что у ghc самые шизанутые сообщения об ошибках всем давно известно.

true_admin ★★★★★ ()
Ответ на: комментарий от true_admin

А то что у ghc самые шизанутые сообщения об ошибках всем давно известно.

Что не так с сообщениями ghc? Помоему всё очевидно.

hateyoufeel ★★★★★ ()
Ответ на: комментарий от true_admin

TypeError: can only concatenate list (not «str») to list

и для какого кода эта ошибка?

hateyoufeel ★★★★★ ()
Ответ на: комментарий от true_admin

GHC 7.6.3

Prelude> [] + 'b'

<interactive>:3:6:
    Couldn't match expected type `[a0]' with actual type `Char'
    In the second argument of `(+)', namely 'b'
    In the expression: [] + 'b'
    In an equation for `it': it = [] + 'b'

А не гонишь ли ты?

hateyoufeel ★★★★★ ()
Ответ на: комментарий от hateyoufeel

Это было из питона в качестве примера user-friendly сообщения об ошибке.

true_admin ★★★★★ ()
Ответ на: комментарий от true_admin

У тебя в твоём питоне + - это оператор, а не функция, как в Haskell. Так что для Haskell сообщения весьма и весьма информативны. Нужно только научиться читать.

hateyoufeel ★★★★★ ()
Ответ на: комментарий от true_admin

А что тут непонятного? Ожидается тип a, а действительный тип - [a], возвращаемый функцией такой-то, в первом аргументе такого-то оператора, который второй аргумент такого-то оператора, всё это с кусками кода и позицией в коде. Только и требуется, что вдумчиво прочитать.

unC0Rr ★★★★★ ()
Ответ на: комментарий от hateyoufeel

Я не говорю что они неинформативны. Я говорю что сообщения об ошибках в хаскеле одни из самых сложных и запутанных. Я надеюсь ты не будешь с этим спорить. Именно поэтому, например, некоторое время назад пытались создать http://en.wikipedia.org/wiki/Helium_(Haskell).

true_admin ★★★★★ ()
Ответ на: комментарий от true_admin

Я не говорю что они неинформативны. Я говорю что сообщения об ошибках в хаскеле одни из самых сложных и запутанных. Я надеюсь ты не будешь с этим спорить.

Как раз таки с этим я и спорю. Если иметь хотя бы базовые понятия о системе типов хаскелла, никаких проблем не возникает.

hateyoufeel ★★★★★ ()
Ответ на: комментарий от hateyoufeel

У тебя в твоём питоне + - это оператор, а не функция, как в Haskell.

в питоне «+» только выглядит как оператор, а в действительности используются методы объектов-аргументов, а методы — по сути специализированные функции.

и как от этого зависят сообщения об ошибках, впрочем, всё равно не ясно

Virtuos86 ★★★★★ ()
Ответ на: комментарий от hateyoufeel

У тебя в твоём питоне + - это оператор, а не функция, как в Haskell.

в питоне «+» только выглядит как оператор, а в действительности используются методы объектов-аргументов, а методы — по сути специализированные функции.

и как от этого зависят сообщения об ошибках, впрочем, всё равно не ясно

Virtuos86 ★★★★★ ()
Ответ на: комментарий от hateyoufeel

У тебя в твоём питоне + - это оператор, а не функция, как в Haskell.

в питоне «+» только выглядит как оператор, а в действительности используются методы объектов-аргументов, а методы — по сути специализированные функции.

и как от этого зависят сообщения об ошибках, впрочем, всё равно не ясно

Virtuos86 ★★★★★ ()
Ответ на: комментарий от grouzen

Эй, но ведь я не пишу на php. И вообще экономист. А Haskell изучаю всего то неделю.

Majesty911 ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.