Как использовать fmap для [возможно строки], чтобы добавленная строка была раньше Just? - PullRequest
5 голосов
/ 20 января 2020

Я получил следующую функцию:

maybeStrings:: [Maybe String] -> [Maybe String]
maybeStrings s = fmap ("Hello, "++) <$> s

Вопрос в том, как я могу получить это «Привет» до Just? Например, пользователь дает следующий список: [Just "Simpson"] и вывод в настоящее время [Just "Hello, Simpson"]. Я хочу, чтобы это было: ["Hello, Just Simpson"].

Ответы [ 3 ]

1 голос
/ 20 января 2020

Начните с более простой функции

foo :: String -> String
foo x = "Hello, Just " ++ x

Затем используйте fmap дважды : один раз для отображения foo над значением Maybe и еще раз для отображения вашего * 1009 Функция * ped по списку Maybe значений:

> fmap foo Nothing
Nothing
> fmap foo (Just "Simpson")
Just "Hello, Just Simpson"
> fmap (fmap foo) [Just "Simpson", Nothing]
[Just "Hello, Just Simpson", Nothing]

Затем

maybeStrings :: [Maybe String] -> [Maybe String]
maybeStrings = fmap (fmap ("Hello, Just " ++))
1 голос
/ 20 января 2020

Я хочу, чтобы это было: ["Hello, Just Simpson"]

Я предполагаю, что это опечатка, и вы хотите:

["Hello", Just "Simpson"]

Это, однако, не возможный. Список содержит элементы одного типа того же . Но здесь ваш список будет содержать String и Maybe String, что не имеет особого смысла.

Если вы хотите добавить к списку Just "Hello", вы можете использовать оператор секционирования здесь:

maybeStrings :: [Maybe String] -> [Maybe String]
maybeStrings s = <b>(</b>Just "Hello" <b>:)</b>

Если вы хотите преобразовать Just <i>x</i> в строку "Hello, Just , вы можете использовать отображение вроде:

maybeStrings :: [Maybe String] -> [String]
maybeStrings = map f
    where f (Just x) = "Hello, "  x
          f Nothing = _

, но тогда вам нужно вернуть строку для Nothing часть. Вы не можете хранить в списке как String s, так и Maybe String s.

Другой чувственный кандидат, рекомендованный @ dopamane , использует catMaybes :: [Maybe a] -> [a]. Это займет список Maybe с и Just с, чтобы преобразовать его в список элементов. Таким образом, мы можем определить функцию:

import Data.Maybe(catMaybes)

maybeStrings :: [Maybe String] -> [String]
maybeStrings = map ("Hello, " ++) . <b>catMaybes</b>
0 голосов
/ 21 января 2020

Если вы хотите, чтобы результат был ["Hello, Just Simpson"], попробуйте следующее:

formatMaybeString :: Maybe String -> String
formatMaybeString Nothing = "Nothing"
formatMaybeString (Just x) = "Just " ++ x

maybeStrings :: [Maybe String] -> [String]
maybeStrings s = fmap (\maybeString -> "Hello, " ++ formatMaybeString maybeString) s

Обратите внимание, что я изменил сигнатуру типа maybeStrings с вашей [Maybe String] -> [Maybe String] на мою [Maybe String] -> [String]. Это потому, что ["Hello, Just Simpson"] это не список Maybe String с, это список обычных String с. Вы не сможете сохранить оригинальную подпись типа и вернуть список со значениями, такими как "Hello, Just Simpson".

...