-- *whistles*
{-# LANGUAGE MultiParamTypeClasses,
FunctionalDependencies,
FlexibleInstances,
OverlappingInstances,
UndecidableInstances,
FlexibleContexts #-}
-- actual thingy
class PipeFirst b f | f -> b where
( |> ) :: f -> ( b -> c) -> c
class PipeFirst' r b f | f -> b where
pipeImpl :: r -> f -> (b -> c) -> c
instance (IsFunction b r, PipeFirst' r b f) => PipeFirst b f where
instance PipeFirst' HTrue b (a -> b) where
pipeImpl _ f g x = (f x) |> g
instance PipeFirst' HFalse b ( a -> b) where
main
= print $ ( f
|> g
) 1 2 3 where f x y z = x + y + z
g = ( * 2 )
-- start black magic
class IsFunction a b | a -> b
instance TypeCast f HTrue => IsFunction ( a -> b) f
instance TypeCast f HFalse => IsFunction a f
class TypeCast a b | a -> b, b -> a where
typeCast :: a -> b
class TypeCast' t a b | t a -> b, t b -> a where
typeCast' :: t-> a-> b
class TypeCast'' t a b | t a -> b, t b -> a where
typeCast'' :: t-> a-> b
instance TypeCast' () a b => TypeCast a b where
typeCast x = typeCast' ( ) x
instance TypeCast'' t a b => TypeCast' t a b where
typeCast' = typeCast''
instance TypeCast'' ( ) a a where
typeCast'' _ x = x
data HTrue
data HFalse
-- end of black magic
LS0gKndoaXN0bGVzKgp7LSMgTEFOR1VBR0UgTXVsdGlQYXJhbVR5cGVDbGFzc2VzLAogICAgICAgICAgICAgRnVuY3Rpb25hbERlcGVuZGVuY2llcywKICAgICAgICAgICAgIEZsZXhpYmxlSW5zdGFuY2VzLAogICAgICAgICAgICAgT3ZlcmxhcHBpbmdJbnN0YW5jZXMsCiAgICAgICAgICAgICBVbmRlY2lkYWJsZUluc3RhbmNlcywKICAgICAgICAgICAgIEZsZXhpYmxlQ29udGV4dHMgIy19CgotLSBhY3R1YWwgdGhpbmd5CgpjbGFzcyBQaXBlRmlyc3QgYiBmIHwgZiAtPiBiIHdoZXJlCiAofD4pIDo6IGYgLT4gKGIgLT4gYykgLT4gYwoKY2xhc3MgUGlwZUZpcnN0JyByIGIgZiB8IGYgLT4gYiB3aGVyZQogcGlwZUltcGwgOjogciAtPiBmIC0+IChiIC0+IGMpIC0+IGMKCmluc3RhbmNlIChJc0Z1bmN0aW9uIGIgciwgUGlwZUZpcnN0JyByIGIgZikgPT4gUGlwZUZpcnN0IGIgZiB3aGVyZQogKHw+KSA9IHBpcGVJbXBsICh1bmRlZmluZWQgOjogcikKCmluc3RhbmNlIFBpcGVGaXJzdCcgSFRydWUgYiAoYSAtPiBiKSB3aGVyZQogcGlwZUltcGwgXyBmIGcgeCA9IChmIHgpIHw+IGcKCmluc3RhbmNlIFBpcGVGaXJzdCcgSEZhbHNlIGIgKGEgLT4gYikgd2hlcmUKIHBpcGVJbXBsIF8gPSBmbGlwICguKQoKbWFpbiA9IHByaW50ICQgKGYgfD4gZykgMSAyIDMKIHdoZXJlIGYgeCB5IHogPSB4ICsgeSArIHoKICAgICAgIGcgPSAoKjIpCgotLSBzdGFydCBibGFjayBtYWdpYwoKY2xhc3MgSXNGdW5jdGlvbiBhIGIgfCBhIC0+IGIKaW5zdGFuY2UgVHlwZUNhc3QgZiBIVHJ1ZSA9PiBJc0Z1bmN0aW9uIChhIC0+IGIpIGYKaW5zdGFuY2UgVHlwZUNhc3QgZiBIRmFsc2UgPT4gSXNGdW5jdGlvbiBhIGYKIApjbGFzcyBUeXBlQ2FzdCBhIGIgfCBhIC0+IGIsIGIgLT4gYSB3aGVyZQogdHlwZUNhc3QgOjogYSAtPiBiCmNsYXNzIFR5cGVDYXN0JyB0IGEgYiB8IHQgYSAtPiBiLCB0IGIgLT4gYSB3aGVyZQogdHlwZUNhc3QnIDo6IHQtPmEtPmIKY2xhc3MgVHlwZUNhc3QnJyB0IGEgYiB8IHQgYSAtPiBiLCB0IGIgLT4gYSB3aGVyZQogdHlwZUNhc3QnJyA6OiB0LT5hLT5iCmluc3RhbmNlIFR5cGVDYXN0JyAoKSBhIGIgPT4gVHlwZUNhc3QgYSBiIHdoZXJlCiB0eXBlQ2FzdCB4ID0gdHlwZUNhc3QnICgpIHgKaW5zdGFuY2UgVHlwZUNhc3QnJyB0IGEgYiA9PiBUeXBlQ2FzdCcgdCBhIGIgd2hlcmUKIHR5cGVDYXN0JyA9IHR5cGVDYXN0JycKaW5zdGFuY2UgVHlwZUNhc3QnJyAoKSBhIGEgd2hlcmUKIHR5cGVDYXN0JycgXyB4ICA9IHgKCmRhdGEgSFRydWUKZGF0YSBIRmFsc2UKCi0tIGVuZCBvZiBibGFjayBtYWdpYw==
compilation info
[1 of 1] Compiling Main ( prog.hs, prog.o )
prog.hs:21:2:
Couldn't match expected type `c' with actual type `a -> c'
`c' is a rigid type variable bound by
the type signature for
pipeImpl :: HTrue -> (a -> b) -> (b -> c) -> c
at prog.hs:21:2
The equation(s) for `pipeImpl' have four arguments,
but its type `HTrue -> (a -> b) -> (b -> c) -> c' has only three
In the instance declaration for `PipeFirst' HTrue b (a -> b)'
prog.hs:24:20:
Couldn't match type `c' with `a -> c'
`c' is a rigid type variable bound by
the type signature for
pipeImpl :: HFalse -> (a -> b) -> (b -> c) -> c
at prog.hs:24:2
Expected type: (b -> c) -> (a -> b) -> c
Actual type: (b -> c) -> (a -> b) -> a -> c
In the first argument of `flip', namely `(.)'
In the expression: flip (.)
In an equation for `pipeImpl': pipeImpl _ = flip (.)
stdout