59 lines
1.3 KiB
Text
59 lines
1.3 KiB
Text
|
{
|
||
|
"cells": [
|
||
|
{
|
||
|
"cell_type": "markdown",
|
||
|
"metadata": {},
|
||
|
"source": [
|
||
|
"### Contravariant Functors"
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "code",
|
||
|
"execution_count": 21,
|
||
|
"metadata": {},
|
||
|
"outputs": [],
|
||
|
"source": [
|
||
|
"{-# LANGUAGE KindSignatures #-}\n",
|
||
|
"\n",
|
||
|
"-- (.) :: (b -> c) -> (a -> b) -> a -> c\n",
|
||
|
"-- contraComp :: (a -> b) -> (b -> c) -> a -> c\n",
|
||
|
"\n",
|
||
|
"-- (.) f g x = f (g x)\n",
|
||
|
"-- contraComp f g x = g (f x)\n",
|
||
|
"\n",
|
||
|
"-- instance Functor (a ->) where\n",
|
||
|
"-- fmap = (.)\n",
|
||
|
"\n",
|
||
|
"-- instance Contravariant (-> z) where\n",
|
||
|
"-- contramap = flip (.)\n",
|
||
|
"\n",
|
||
|
"newtype Predicate a = Predicate { getPredicate :: a -> Bool }\n",
|
||
|
"\n",
|
||
|
"newtype Op b a = Op { getOp :: a -> b }\n",
|
||
|
" \n",
|
||
|
"class Contravariant (f :: * -> *) where\n",
|
||
|
" contramap :: (a -> b) -> f b -> f a\n",
|
||
|
" \n",
|
||
|
"instance Contravariant (Op a) where\n",
|
||
|
" contramap f g = Op $ let bToa = getOp g in bToa . f"
|
||
|
]
|
||
|
}
|
||
|
],
|
||
|
"metadata": {
|
||
|
"kernelspec": {
|
||
|
"display_name": "Haskell",
|
||
|
"language": "haskell",
|
||
|
"name": "haskell"
|
||
|
},
|
||
|
"language_info": {
|
||
|
"codemirror_mode": "ihaskell",
|
||
|
"file_extension": ".hs",
|
||
|
"name": "haskell",
|
||
|
"pygments_lexer": "Haskell",
|
||
|
"version": "8.8.3"
|
||
|
}
|
||
|
},
|
||
|
"nbformat": 4,
|
||
|
"nbformat_minor": 4
|
||
|
}
|