Реализация последней функции

В отличие от XML и XHTML, HTML не знает о закрывающемся автоматически синтаксисе. Браузеры, которые интерпретируют XHTML как HTML, не знают, что / символ указывает, что тег должен быть закрывающимся автоматически; вместо этого они интерпретируют его как пустой атрибут, и синтаксический анализатор все еще думает, что тег 'открыт'.

Так же, как <script defer> рассматривается, как <script defer="defer">, <script /> рассматривается как <script /="/">.

8
задан Ayman Hourieh 2 August 2009 в 17:19
поделиться

4 ответа

Проблема - как и многие другие, когда вы изучаете 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

Но я подозреваю, что вариант "Может быть" - лучший вариант.

31
ответ дан 5 December 2019 в 04:38
поделиться

Всем спасибо за ответы. Я пробовал ...

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]
0
ответ дан 5 December 2019 в 04:38
поделиться

Решение EFraim должно работать (проголосовало "за"). Но я думаю, что это немного больше похоже на Haskell:

mylast [] = Nothing
mylast (x:[]) = Just x
mylast (x:xs) = mylast xs

Заявление об ограничении ответственности: я на самом деле не пробовал это. Возможно, я допустил синтаксические ошибки.

6
ответ дан 5 December 2019 в 04:38
поделиться

Попробуйте вместо этого mylast [] = error «Пустой список!» . В противном случае Haskell не сможет определить тип вашей функции.

8
ответ дан 5 December 2019 в 04:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: