This technique helps validate arbitrary conditions in deeply nested structures without writing additional code — with the help of Haskell Generics.
It boils down to this pattern:
diff --git a/ghcide/src/Development/IDE/Core/Compile.hs b/ghcide/src/Development/IDE/Core/Compile.hs | |
index 99938bd4..471b184c 100644 | |
--- a/ghcide/src/Development/IDE/Core/Compile.hs | |
+++ b/ghcide/src/Development/IDE/Core/Compile.hs | |
@@ -122,6 +122,15 @@ import GHC.Hs (LEpaComment) | |
import qualified GHC.Types.Error as Error | |
#endif | |
+import StgSyn | |
+import FastString |
import ast | |
import sys | |
from enum import Enum | |
from typing import Dict, NamedTuple, Union | |
class PrimType(Enum): | |
ty_int = "int" | |
ty_bool = "bool" |
from dataclasses import dataclass | |
from typing import Generic, Optional, TypeVar | |
class Raw: | |
pass | |
class Valid: | |
pass |
Это Literate Haskell файл. Вот как загрузить его в ghci:
$ stack --resolver=lts-13.6 install markdown-unlit
$ stack --resolver=lts-13.6 ghci enums.md --package aeson --package validation --package semigroups --package containers --package lens --package generic-lens --ghci-options='-pgmL markdown-unlit'
{-# LANGUAGE DeriveGeneric, DerivingVia, FlexibleInstances, UndecidableInstances #-} | |
import Data.Aeson | |
import Data.Aeson.Casing | |
import GHC.Generics | |
newtype CamelCaseJson a = CamelCaseJson a | |
deriving (Eq, Show, Generic) | |
instance (GToJSON Zero (Rep a), Generic a) => ToJSON (CamelCaseJson a) where |
This is a minimal reproducing example for bug in GHC. It is observed in 8.6.3 (Stack LTS-13.6), 8.6.5 (nix) and 8.8.1 (nix).
$ ghc Exp.hs -ddump-splices
[1 of 2] Compiling TH ( TH.hs, TH.o )
[2 of 2] Compiling Exp ( Exp.hs, Exp.o )
Exp.hs:11:1-10: Splicing declarations make ''Bar ======>
Exp.hs:11:1: error:
Молекулярная динамика — слишком красивая и наглядная тема, чтобы обойтись скучными задачами на CodeForces. Поэтому мы решили сделать задачи с визуализацией, чтобы вы увидели, как те или иные формулы выглядят "вживую".
Мы подготовили файл-заглушку, в которую вам нужно будет дописать свой код для интегрирования Verlet и для конкретных сил, которые предложены в заданиях ниже.
Наш курс включает в себя решения задач на практических занятиях, а также домашние задания. Для этого вам понадобится ноутбук с Python.
Если у вас уже установлен Python и вы уверены, что умеете им пользоваться, переходите сразу к разделам "Установка нужных библиотек" и "Дополнительные материалы".
Если у вас Mac — попробуйте адаптировать эту инструкцию для себя или обратитесь за помощью к организаторам курса. Если же у вас Linux, то вы скорее всего сами всё знаете. Если что-то всё же не получается, попросите помощи в нашем чате.
haskell-lsp:Starting up server ... | |
2018-09-07 11:49:18.303525648 [ThreadId 4] - ---> {"jsonrpc":"2.0","method":"initialize","params":{"capabilities":{"textDocument":{"completion":{"completionItem":{"snippetSupport":false}}},"workspace":{"applyEdit":true,"didChangeWatchedFiles":{"dynamicRegistration":true}}},"processId":31802,"rootPath":"/home/maks/Projects/SRK/ariadne","rootUri":"file:///home/maks/Projects/SRK/ariadne","trace":"off"},"id":47} | |
2018-09-07 11:49:18.303819425 [ThreadId 4] - haskell-lsp:initializeRequestHandler: setting current dir to project root:/home/maks/Projects/SRK/ariadne | |
2018-09-07 11:49:18.304185589 [ThreadId 6] - <--2--{"result":{"capabilities":{"textDocumentSync":{"openClose":true,"change":2,"willSave":false,"willSaveWaitUntil":false,"save":{"includeText":false}},"documentRangeFormattingProvider":true,"documentHighlightProvider":true,"executeCommandProvider":{"commands":["490:applyrefact:applyOne","490:applyrefact:applyAll","490:applyrefact:lint","490:base:version","490:base:plugins","4 |