Извлечь из [a] - PullRequest
       33

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

2 голосов
/ 30 мая 2011

как я могу легко взять следующее

[4]

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

4

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

Ответы [ 5 ]

11 голосов
/ 30 мая 2011

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

getSingleton [a] = a
6 голосов
/ 30 мая 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, либо другой метод для выполнения дальнейших операций .

5 голосов
/ 30 мая 2011

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

Prelude> head [4]
4
Prelude> head []
*** Exception: Prelude.head: empty list
2 голосов
/ 30 мая 2011

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

head [4]
0 голосов
/ 30 мая 2011

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

double x = 2*x

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

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

...