LINUX.ORG.RU

Объясните смысл λ-терма

 ,


0

2

Изучаю чужой конфиг для xmonad. Наткнулся на такие вот примерно строки

fileToLogger :: (String -> String) -> String -> FilePath -> Logger
fileToLogger f e p = do
    let readWithE f1 e1 p1 = E.catch (do
        contents <- readFile p1
        return $ f1 (initNotNull contents) ) ((\_ -> return e1) :: E.SomeException -> IO String)
    str <- liftIO $ readWithE f e p
    return $ return str
-- Battery status
batStatus :: Logger
batStatus = fileToLogger (\x -> x) "AC Conection" "/sys/class/power_supply/BAT1/status"
Я так понимаю, что λх.х - эдакий пустой терм, правильно? Что то вроде:
myfunc::String->String
myfunc a = a
Зачем он тут нужен?

★★★

Автор конфига не знал про id?

anonymous ()

Судя по всему, потому что fileToLogger принимает функцию-обработчик, а тут она не нужна

keyran ★★ ()

Быдлокод, он и на хаскеле быдлокод.

Прочитал, и даже умилился. Именно так я лет 6 назад на нем и писал.

\x -> x это то же самое что и id. В данном случае уместно, поскольку fileToLogger первым параметром принимает какое-то преобразование, которое в данном случае не требуется.

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

id это функция из Prelude которая возвращает переданный ей аргумент.

id :: a -> a
id x = x

или

id = (\x -> x)

Для поиска хаскелльных функций можно использовать hoogle.

http://www.haskell.org/hoogle/?hoogle=id

zinfandel ★★ ()
Последнее исправление: zinfandel (всего исправлений: 2)
Ответ на: комментарий от true_admin
-# LANGUAGE ScopedTypeVariables #-}
-- Convert the content of a file into a Logger
fileToLogger :: (String -> String) -> String -> FilePath -> Logger
fileToLogger f def path = liftIO . fmap Just $
    fmap (f . initNotNull) (readFile path)
      `E.catch` \(_ :: E.IOException) -> return def

btw, initNotNull тоже какая-то гадость. Прагма необязательно, чтобы чуть короче было. Можно вообще catch -> handle, «pointfree» и убрать `path'.

anonymous ()
Ответ на: комментарий от true_admin
fileToLogger :: (String -> String) -> String -> FilePath -> Logger
fileToLogger f e p =
	liftIO $ return <$> handle (\(_ :: IOException) -> return e) 
	                           (f . initNotNull <$> readFile p)

-- Battery status
batStatus :: Logger
batStatus = fileToLogger id "AC Conection" "/sys/class/power_supply/BAT1/status"

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

Опередил. Радует что почти одинаково, только у тебя у меня <$> вмест fmap и return вместо Just. Кстати fmap в этом случае приятнее смотрится, я как-то предпочитаю <$> использовать.

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

А сейчас бы ты как написал, милая?

anonymous ()
Ответ на: комментарий от zinfandel

я как-то предпочитаю <$> использовать

Ну это примерно как . vs $, если выносить наружу, то g . (f <$>) не смотрится. Вместо второго было бы нормально, но тогда скобки вокруг второй строки => субъективно воспринимается, что акцент смещается на catch, с fmap-ом же он смотрится как вспомогательная «добавка», что ближе к сути.

anonymous ()

Смысл там в моноиде, из категории недофункторов. Он типизирует моноидальный функтор и морфизмы факторизуются в фрактал-факториал (от слова fuck). А ты есть изоморфизм в илитарный суперкласс теперь, я горжусь тобой.

anonymous ()
Ответ на: комментарий от Macil

Ты чо 6 лет на хаскеле пишешь? Ну, ты, значит, клинический. Обынчо у школоты это быстро проходит, в течении года, максимум.

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