LINUX.ORG.RU

Сравнить String и X(Maybe String)

 ,


0

2

Есть ф-ция следующего вида

logLayout :: Logger
Logger :
type Logger = X (Maybe String)
Я хочу сравнить то, что возвращает ф-ция Logger, с константной строкой («Full» например). Как мне это сделать? Я пытался что-то вроде вот такого
if(logLayout == return (Just "Full"))
.....
Получил вот такое
No instance for (Eq Logger) arising from a use of ‘==’
    In the first argument of ‘(||)’, namely
      ‘(logLayout == return (Just "Full"))’

★★★

Покажи контекст, в котором это вызывается.

fmdw
()
Ответ на: комментарий от hateyoufeel
logLayout >>= \l -> if l == Just "Full" then yadayada else yadayada

Можешь не благодарить.

hateyoufeel ★★★★★
()

No instance for (Eq Logger) arising from a use of ‘==’

ghc, тебе говорит

Не имплементирован (Eq Logger), который необходим для использования функции '=='

-> Не имплементирован тип классов 'Eq' для типа Logger

-> Я не знаю как сравнить для значения типа Logger

Logger это синоним для типа 'X (Maybe String)', X это такая Xmonad-ная надстройка над IO, то есть по сути Logger совершает некоторое действие в реальном мире и возвращает (Maybe String). Следовательно пытаясь сравнить два Logger ты пытаешься сравнить два разных действия над реальным миром, что не имеет смысла.

Что же нужно сделать для того чтобы сравнить Maybe String который возвращается Logger-ом. Нужно извлечь этот Maybe String из Logger-а другими словами выполнить действие которое он несет. Как указал hateyoufeel, это можно сделать вот так:

logLayout >>= \l -> if l == Just "Full" then yadayada else yadayada

Если воспользоваться синтаксическим сахаром 'do-нотация', то можно сделать это вот так:

do
    layout <- logLayout -- извлекаем layout из logger (выполняем действие)
    if layout == Just "Full"
    then yadayada
    else yadayada
zinfandel ★★
()
Ответ на: комментарий от zinfandel

Воо, спасибо. Т е получается если я хочу «превратить» IO String в String нужно воспользоваться оператором <- ?

LIKAN ★★★
() автор топика
Ответ на: комментарий от LIKAN

Поясню для С программистов:

someAction :: IO String

Это не просто String завернутый во чтото. Это какбы

 
char* (*someAction)();

То есть, значение ты получишь только после выполнения некоторых действий, возможно действие прочтет его из файла, или запустит ракеты и вернет рандомную строку.

s9gf4ult ★★
()
Ответ на: комментарий от LIKAN

Т е получается если я хочу «превратить» IO String в String нужно воспользоваться оператором <- ?

Получается, чтобы «превратить» m a в a, где m — это монада, тебе нужно использовать «оператор» <-. IO — это одна из монад.

theNamelessOne ★★★★★
()

fmap . (maybe False (== a))?

Результатом будет X Bool.

Тред не читал.

qnikst ★★★★★
()
Последнее исправление: qnikst (всего исправлений: 1)
Ответ на: комментарий от LIKAN

Нет. «<-» не оператор. Это просто синтаксический сахар. Вкуривай do синтаксис для монад. Если кратко, то

do{a <- f1; f2 a}
раскрывается в
f1 >>= (\a -> f2 a)

Aswed ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.