Потерял анальную девственность с Template Haskell.
Код у всех такой уёбищный → http://ompldr.org/vaGsxNA/s.png ← или я один лошара?
Алсо, поделитесь секретами бытия, как в хачкиле не уходить за овер 100 символов в строку.
Больше кода в квотейшенах пиши, будет понятнее. А вообще да, оно убогое нечитабельное говно по большей части. Что поделать, других инструментов нет.
>как в хачкиле не уходить за овер 100 символов в строку
Настоятельно рекомендую всегда использовать этот стайл гайд: https://github.com/tibbe/haskell-style-g.....l-style.md
Он очень правильный. Особенно это касается _всегда_ явных импортов, _всегда_ -Wall, _всегда_ типы у top-level (впрочем, об этом тебе Wall напомнит). Стилистические соглашения не так важны на фоне этого.
Олсо, поделись .vimrc, тоже хочу такой модный статуслайн.
@ap Если большая часть в квотейшене, а не хуярится синтаксическими операторами, то в принципе понятно, что оно генерирует. Вот, например:
{-# LANGUAGE TemplateHaskell, FlexibleInstances #-}
module TH2 where
import Data.List (intercalate)
import Language.Haskell.TH
import Language.Haskell.TH.Syntax (VarStrictType)
deriveShow :: Name -> DecsQ
deriveShow name = do
info <- reify name
case info of
TyConI (DataD _ _ _ [RecC _ fields] _) ->
[d| instance Show $(conT name) where
show rec = $(showRec fields)
|]
_ ->
error "Not implemented"
where
showRec :: [VarStrictType] -> ExpQ
showRec fields =
let rec = show name ++ ":\n\t"
in [| rec ++ intercalate "\n\t" $(listE $ map showField fields) |]
showField :: VarStrictType -> ExpQ
showField (fieldName, _, _) =
let recName = mkName "rec"
field = show fieldName ++ ": "
in [| field ++ show $(appE (varE fieldName) (varE recName)) |]
Поясните хотя бы как вот это починить?
[ValD _ body dec] <- [d|parse = $(global 'fmap) $(conE name) $(parserE consName)|]
return $ ValD (VarP parserName) body dec
@plhk Во всех стайл-гайдах, что я видел, говорили использовать 80 символов максимально в длину.
Просто обычно это универсальное правило. Если код длиннее, то скорее всего ты что-то делаешь не так. Обычно это 50-60 на самом деле, к 80 редко должен подбираться, т.к. большая вложенность тоже плохо читается.
@kagami Но ведь на хаскеле код чаще растет в ширину, а не в длину. Поэтому можно легко уползти за 200 символов сильно не напрягаясь.
Алсо у меня в имаксике залезший за 80 символов код просто ненавязчиво меняет цвет. И не мешает когда пишешь, и сразу видно чо куда когда форматируешь.
@plhk Совсем тупой что ли? Большой монитор чтобы открыть много терминалов по 80 символов. У меня помещается 2 + один маленький с watch-скриптами/дебаг-серверами в консоли.
@kagami Точнее $(varE parserName). Ну там надо рефакторить, короче, мне лень. Суть в том, чтобы писать код так, чтобы было похоже на то, что оно вернёт.
Олсо, тебе кастомное имя функции на самом деле нахер не сдалось. Можешь писать тупо в квотейшене, он сам их гигиеничными сделает:
Prelude Language.Haskell.TH> runQ [d| test = 123 + 456 |]
[ValD (VarP test_3) (NormalB (InfixE (Just (LitE (IntegerL 123))) (VarE GHC.Num.+) (Just (LitE (IntegerL 456))))) []]