[haskell] - не работает пример
От: DemAS http://demas.me
Дата: 30.10.09 08:12
Оценка:
maximum2 :: (Ord a) => [a] -> a
maximum2 [] = error "maximum of empty list"
maximum2 [x] = x
maximum2 [x:xs]
         | x > maxTail = x
         | otherwise   = maxTail
         where maxTail = maximum2 xs


Prelude> :load test1.hs
[1 of 1] Compiling Main ( test1.hs, interpreted )

test1.hs:90:0:
Occurs check: cannot construct the infinite type: a = [a]
When generalising the type(s) for `maximum2'
Failed, modules loaded: none.


Взял отсюда http://learnyouahaskell.com/recursion

Самое неприятное, что я пока не научился понимать, на что он вообще ругается.
Re: [haskell] - не работает пример
От: lomeo Россия http://lomeo.livejournal.com/
Дата: 30.10.09 08:25
Оценка:
Здравствуйте, DemAS, Вы писали:

DAS>
DAS>maximum2 [x:xs]
DAS>


Скобки на круглые поменяй.
Re[2]: [haskell] - не работает пример
От: DemAS http://demas.me
Дата: 30.10.09 08:29
Оценка:
Здравствуйте, lomeo, Вы писали:

L>Скобки на круглые поменяй.


А можешь пояснить, почему:

maximum2 []
maximum2 [x]

но:

maximum2 (x:xs)
Re: [haskell] - не работает пример
От: DrDred Россия  
Дата: 30.10.09 08:29
Оценка:
Здравствуйте, DemAS, Вы писали:


DAS>
DAS>maximum2 :: (Ord a) => [a] -> a
DAS>maximum2 [] = error "maximum of empty list"
DAS>maximum2 [x] = x
DAS>maximum2 [x:xs]
DAS>         | x > maxTail = x
DAS>         | otherwise   = maxTail
DAS>         where maxTail = maximum2 xs
DAS>


DAS>

DAS>Prelude> :load test1.hs
DAS>[1 of 1] Compiling Main ( test1.hs, interpreted )

DAS>test1.hs:90:0:
DAS> Occurs check: cannot construct the infinite type: a = [a]
DAS> When generalising the type(s) for `maximum2'
DAS>Failed, modules loaded: none.


DAS>Взял отсюда http://learnyouahaskell.com/recursion


DAS>Самое неприятное, что я пока не научился понимать, на что он вообще ругается.


Нужно (x:xs) вместо выделенного
--
WBR, Alexander
Re[3]: [haskell] - не работает пример
От: DrDred Россия  
Дата: 30.10.09 08:38
Оценка:
Здравствуйте, DemAS, Вы писали:

DAS>Здравствуйте, lomeo, Вы писали:


L>>Скобки на круглые поменяй.


DAS>А можешь пояснить, почему:


DAS>maximum2 []

DAS>maximum2 [x]

DAS>но:


DAS>maximum2 (x:xs)


Ну можно видеть, что тип у ( следующий a -> [a] -> [a]
Соответственно получается [a]] вместо желаемого [a], на что и ругается компилятор.
А скобки нужны, чтобы обозначить, что это один параметр функции
--
WBR, Alexander
Re[3]: [haskell] - не работает пример
От: lomeo Россия http://lomeo.livejournal.com/
Дата: 30.10.09 08:42
Оценка: 2 (1)
Здравствуйте, DemAS, Вы писали:

DAS>maximum2 []


Это — пустой список

DAS>maximum2 [x]


Это сахар для списка x:[]

DAS>maximum2 (x:xs)


Здесь скобки не играют роли (кроме синтаксической группировки). Это просто список x:xs (сравни с предыдущим)

[x:xs] — это сахар для списка (x:xs):[], т.е. список, у которого голова — список x:xs, а хвост — пустой список. Его тип [a]] — список списков.

Вообще, когда видишь [..] и что-то внутри, то это всегда сахар. Если запятых нет, то [X] ~ X:[], если запятые есть, то [X1,X2,..] ~ X1:X2:...:[]
Re[4]: [haskell] - не работает пример
От: lomeo Россия http://lomeo.livejournal.com/
Дата: 30.10.09 08:43
Оценка:
Здравствуйте, lomeo, Вы писали:

L>Его тип [a]] — список списков.


Форматирование съело первую скобку. Должно быть [[a]].
Re: [haskell] - не работает пример
От: DemAS http://demas.me
Дата: 02.11.09 09:55
Оценка:
Здравствуйте, DemAS, Вы писали:

А ведь все равно не работает:


maximum2 :: (Ord a) => [a] -> a
maximum2 []  = error "maximum of empty list"
maximum2 [x] = x
maximum (x:xs) 
        | x > maxTail = x
        | otherwise   = maxTail
        where maxTail = maximum2 xs


*Main> maximum2 [1,2,3]
*** Exception: test1.hs82,0)-(83,15): Non-exhaustive patterns in function maximum2

Re[2]: [haskell] - не работает пример
От: geniepro http://geniepro.livejournal.com/
Дата: 02.11.09 10:12
Оценка: 2 (1)
Здравствуйте, DemAS, Вы писали:

DAS>Здравствуйте, DemAS, Вы писали:


DAS>А ведь все равно не работает:



А так:

maximum2 :: (Ord a) => [a] -> a
maximum2 []  = error "maximum of empty list"
maximum2 [x] = x
maximum2 (x:xs) 
          | x > maxTail = x
          | otherwise   = maxTail
        where maxTail = maximum2 xs
Re[2]: [haskell] - не работает пример
От: Мишень-сан  
Дата: 02.11.09 10:16
Оценка: 2 (1)
Здравствуйте, DemAS, Вы писали:

DAS>А ведь все равно не работает:


DAS>
DAS>maximum2 :: (Ord a) => [a] -> a
DAS>maximum2 []  = error "maximum of empty list"
DAS>maximum2 [x] = x
DAS>maximum2 (x:xs) 
DAS>        | x > maxTail = x
DAS>        | otherwise   = maxTail
DAS>        where maxTail = maximum2 xs
DAS>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.