Извлечь из [а]

как я могу легко принять следующее

[4]

и верните следующее:

4

Я знаю, что [4] !! 0 работает, но не кажется хорошей стратегией ...


person maclunian    schedule 29.05.2011    source источник


Ответы (5)


Просто сопоставьте его с шаблоном:

getSingleton [a] = a
person gatoatigrado    schedule 29.05.2011

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, или другой метод для выполнения дальнейших операций.

person Thomas M. DuBuisson    schedule 29.05.2011

В качестве альтернативы решению gatoatigrado вы также можете использовать функцию head, которая извлекает первый элемент списка, но также будет работать со списками с более чем одним элементом и, кроме того, является стандартной функцией в Prelude. Вам просто нужно быть осторожным, чтобы не применять его к пустым спискам, иначе вы получите исключение времени выполнения.

Prelude> head [4]
4
Prelude> head []
*** Exception: Prelude.head: empty list
person Thies Heidecke    schedule 29.05.2011
comment
На самом деле это не то же самое, что решение gatoatigrado. В частности, head вернет первый элемент списка из нескольких элементов, в то время как getSingleton вызовет ошибку, если список содержит более элементов. Что предпочтительнее, конечно, зависит от варианта использования. - person sepp2k; 30.05.2011
comment
о, да, вы правы, спасибо, что указали на это, я упустил это из виду. Я обновлю свой ответ соответственно. - person Thies Heidecke; 30.05.2011

Если вам нужен этот первый элемент в списке, вы можете просто сделать

head [4]
person djhworld    schedule 29.05.2011

[] - это монада. Итак, вы используете операцию «извлечения» монады, <-

double x = 2*x

doubleAll xs = do x <- xs
                  return (double x)

Конечно, результат монадического вычисления возвращается в монаде. ;)

person Dan Burton    schedule 30.05.2011