как я могу легко принять следующее
[4]
и верните следующее:
4
Я знаю, что [4] !! 0 работает, но не кажется хорошей стратегией ...
как я могу легко принять следующее
[4]
и верните следующее:
4
Я знаю, что [4] !! 0 работает, но не кажется хорошей стратегией ...
Просто сопоставьте его с шаблоном:
getSingleton [a] = a
head
- это нормальный ответ, три из которых вы видите (один с произвольным именем) - это функционально то же самое, что вы уже знаете (x !! 0
~ head x
). Я настоятельно рекомендую не использовать частичные функции, если вы не докажете (с учетом местных особенностей), что никогда не передадите пустой список и не вызовете исключение во время выполнения.
Если ваша функция не гарантирует непустой список, используйте listToMaybe :: [a] -> Maybe a
:
> listToMaybe [4]
Just 4
> listToMaybe [5,39,-2,6,1]
Just 5
> listToMaybe []
Nothing -- A 'Nothing' constructor instead of an exception
Когда у вас есть Maybe a
, вы можете сопоставить его с шаблоном, оставьте его как Maybe и используйте fmap
или монаду Maybe, или другой метод для выполнения дальнейших операций.
В качестве альтернативы решению gatoatigrado вы также можете использовать функцию head
, которая извлекает первый элемент списка, но также будет работать со списками с более чем одним элементом и, кроме того, является стандартной функцией в Prelude. Вам просто нужно быть осторожным, чтобы не применять его к пустым спискам, иначе вы получите исключение времени выполнения.
Prelude> head [4]
4
Prelude> head []
*** Exception: Prelude.head: empty list
head
вернет первый элемент списка из нескольких элементов, в то время как getSingleton
вызовет ошибку, если список содержит более элементов. Что предпочтительнее, конечно, зависит от варианта использования.
- person sepp2k; 30.05.2011
Если вам нужен этот первый элемент в списке, вы можете просто сделать
head [4]
[]
- это монада. Итак, вы используете операцию «извлечения» монады, <-
double x = 2*x
doubleAll xs = do x <- xs
return (double x)
Конечно, результат монадического вычисления возвращается в монаде. ;)