Есть ли встроенная функция с подписью :: (Monad m) => m a -> a
?
Если Google говорит, что нет ... тогда, вероятно, нет, если вы определите "встроенный "is" в базовые библиотеки ".
Hoogle говорит, что такой функции нет.Не могли бы вы объяснить, почему?
Это просто, потому что Hoogle не нашел в базовых библиотеках ни одной функции, которая бы соответствовала сигнатуре этого типа!
Если серьезно, я полагаю, вы просилимонадическое объяснение.Вопросы безопасность и , что означает .(См. Также мои предыдущие мысли о magicMonadUnwrap :: Monad m => m a -> a
)
Предположим, я говорю вам, что у меня есть значение типа [Int]
.Поскольку мы знаем, что []
- это монада, это похоже на сообщение, что у меня есть значение типа Monad m => m Int
.Итак, давайте предположим, что вы хотите получить Int
из этого [Int]
.Ну, какой Int
ты хочешь?Первый?Последний?Что если значение, о котором я говорил, на самом деле пустой список?В этом случае вам даже не дадут Int
!Поэтому для списков небезопасно пытаться извлекать одно и то же значение так или иначе.Даже когда это безопасно (непустой список), вам нужна специфическая для списка функция (например, head
), чтобы уточнить, что вы подразумеваете , желая f :: [Int] -> Int
.Надеемся, что вы можете понять, что , означающее из Monad m => m a -> a
, просто не определено.Он может иметь несколько значений для одной и той же монады или вообще ничего не значить для некоторых монад, а иногда это просто небезопасно.