MARK P. JONES
Pacific Software Research Center
Department of Computer Science and Engineering
Oregon Graduate Institute of Science and Technology
data Query = Query | |
data SomeObj = SomeObj | |
data IoOnlyObj = IoOnlyObj | |
data Err = Err | |
-- There's a decoder function that makes some object from String | |
decodeFn :: String -> Either Err SomeObj | |
decodeFn = undefined | |
-- There's a query, that runs against DB and returns array of strings |
One of the many things I do for my group at work is to take care of automating as many things as possible. It usually brings me a lot of satisfaction, mostly because I get a kick out of making people's lives easier.
But sometimes, maybe too often, I end up in drawn-out struggles with machines and programs. And sometimes, these struggles bring me to the edge of despair, so much so that I regularly consider living on a computer-less island growing vegetables for a living.
This is the story of how I had to install Pandoc in a CentOS 6 Docker container. But more generally, this is the story of how I think computing is inherently broken, how programmers (myself included) tend to think that their way is the way, how we're ultimately replicating what most of us think is wrong with society, building upon layers and layers of (best-case scenario) obscure and/or weak foundations.
*I would like to extend my gratitude to Google, StackOverflow, GitHub issues but mostly, the people who make the
-- to watch: telnet localhost 8887 | |
-- to stream: script -f >( (echo hello streamname; cat -) | nc localhost 8888 > /dev/null ) | |
{-# LANGUAGE OverloadedStrings #-} | |
module Fcast where | |
import Control.Concurrent | |
import Control.Concurrent.STM | |
import Control.Monad | |
import Control.Monad.Fix |
{-# LANGUAGE InstanceSigs, OverloadedStrings #-} | |
module Text.Parser.Selmer where | |
import Control.Applicative | |
import Data.Char (isAlpha) | |
import Data.Map.Lazy (Map) | |
import qualified Data.Map.Lazy as M | |
import Data.Maybe (fromMaybe) | |
import Data.Monoid |
{-# LANGUAGE GADTs, DataKinds, KindSignatures, TypeOperators, TypeFamilies, | |
MultiParamTypeClasses, FlexibleInstances, PolyKinds, FlexibleContexts, | |
UndecidableInstances, ConstraintKinds, OverlappingInstances, ScopedTypeVariables #-} | |
import GHC.TypeLits | |
import Data.Type.Bool | |
import Data.Type.Equality | |
import Data.Proxy | |
import Control.Applicative ((<$>), (<*>)) | |
import Data.Maybe (catMaybes) |
# This template will give you a prompt with: | |
# - ghc | |
# - cabal | |
# - ghc-mod | |
# - the libraries: free, mtl, transformers | |
# | |
# to run: nix-shell haskell-project.nix | |
# | |
# to specify specific version of haskell, you can: | |
# nix-shell --arg haskellPackages 'with import <nixpkgs> {}; haskellPackages_ghc783_profiling' |
using this Aeson example:
do result <- decode "{\"name\":\"Dave\",\"age\":2}"
flip parseMaybe result $ \obj -> do
age <- obj .: "age"
name <- obj .: "name"
return (name ++ ": " ++ show (age*2))
Just "Dave: 4"
import Control.Exception | |
import Control.Monad | |
import Control.Monad.IO.Class | |
import Data.ByteString.Lazy (ByteString) | |
import Data.ByteString.Lazy.UTF8 (toString) | |
import Data.Function | |
import Data.Enumerator | |
import Data.List | |
import Data.Maybe |