В отличие от XML и XHTML, HTML не знает о закрывающемся автоматически синтаксисе. Браузеры, которые интерпретируют XHTML как HTML, не знают, что /
символ указывает, что тег должен быть закрывающимся автоматически; вместо этого они интерпретируют его как пустой атрибут, и синтаксический анализатор все еще думает, что тег 'открыт'.
Так же, как <script defer>
рассматривается, как <script defer="defer">
, <script />
рассматривается как <script /="/">
.
Проблема - как и многие другие, когда вы изучаете Haskell - это типизация. Введите следующее в GHCi
:t mylast
, и вы увидите, что сигнатура типа
mylast :: [[a]] -> [a]
, которая ожидает список списков и вернет список. Итак, если вы добавите список строк ["боб", "забор", "дом"], функция будет работать так, как вы ее написали.
Проблема в вашем базовом случае: mylast [] = [], который сообщает компилятору, что вы хотите вернуть список. Вы хотите вернуть элемент, а не список. Но в Haskell нет пустого элемента (в значительной степени по замыслу), поэтому вам нужно использовать монаду Maybe.
mylast :: [a] -> Maybe a
mylast [] = Nothing
mylast (x:[]) = Just x
mylast (x:xs) = mylast xs
Монады - это несколько абстрактная тема, но вам понадобится монада Maybe, когда вы только начинаете. Все, что вам нужно знать об этом, это это ' объявление типа sa, которое сообщает компилятору ожидать двух возможных вариантов: «Ничего» или «Просто x». Затем возвращаемый код может взять x и работать с ним, но если вы оставите "Just", компилятор пожалуется.
Альтернативой является выдача ошибки при обнаружении пустого списка, например:
mynextlast [] = error "no empty lists allowed"
mynextlast (x:[]) = x
mynextlast (x:xs) = mynextlast xs
Но я подозреваю, что вариант "Может быть" - лучший вариант.
Всем спасибо за ответы. Я пробовал ...
mylast :: [a] -> Maybe a
mylast [] = Nothing
mylast (x:[]) = Just x
mylast (x:xs) = mylast xs
и получаю, например ...
Main> mylast3 [2,4,66,5,4,33]
Just 33 :: Maybe Integer
Есть ли способ заставить его не печатать "только" в ответе?
[EDIT: Jörg W Mittag] (Комментарии ужасны для публикации кода ...)
Вот как весь код выглядит в контексте:
mylast [] = Nothing
mylast [x] = Just x
mylast (x:xs) = mylast xs
mylook (Just a) = do print a
mylook Nothing = do error "Nothing to see here, move along!"
mylook $ mylast [2,4,66,5,4,33]
Решение EFraim должно работать (проголосовало "за"). Но я думаю, что это немного больше похоже на Haskell:
mylast [] = Nothing
mylast (x:[]) = Just x
mylast (x:xs) = mylast xs
Заявление об ограничении ответственности: я на самом деле не пробовал это. Возможно, я допустил синтаксические ошибки.
Попробуйте вместо этого mylast [] = error «Пустой список!»
. В противном случае Haskell не сможет определить тип вашей функции.