codesnippets:parametrictypeforanintermediatevaluewhencombiningfunctions
Differences
This shows you the differences between two versions of the page.
| Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
| codesnippets:parametrictypeforanintermediatevaluewhencombiningfunctions [2021/04/24 22:05] – f2b216 | codesnippets:parametrictypeforanintermediatevaluewhencombiningfunctions [2025/10/08 00:48] (current) – external edit 127.0.0.1 | ||
|---|---|---|---|
| Line 1: | Line 1: | ||
| ====== Parametric type for an intermediate value when combining functions ====== | ====== Parametric type for an intermediate value when combining functions ====== | ||
| - | ~~DISCUSSION~~ | ||
| * example with the folling problem(s): | * example with the folling problem(s): | ||
| Line 32: | Line 31: | ||
| render (Contains (MyData n)) = Oct.toOctets n | render (Contains (MyData n)) = Oct.toOctets n | ||
| render (Error _) = [] | render (Error _) = [] | ||
| + | </ | ||
| + | * compiles, with error:< | ||
| + | app\Main.hs: | ||
| + | * Could not deduce (Builder g0) | ||
| + | from the context: Builder g | ||
| + | bound by the type signature for: | ||
| + | | ||
| + | at app\Main.hs: | ||
| + | The type variable `g0' is ambiguous | ||
| + | * In the ambiguity check for `buildNRender' | ||
| + | To defer the ambiguity check to use sites, enable AllowAmbiguousTypes | ||
| + | When checking the class method: | ||
| + | buildNRender :: forall g. Builder g => String -> [W.Word8] | ||
| + | In the class declaration for `Builder' | ||
| + | | | ||
| + | 19 | | ||
| + | | ||
| </ | </ | ||
| * example that solves the problem with extensions | * example that solves the problem with extensions | ||
| Line 100: | Line 116: | ||
| data Proxy a = Proxy | data Proxy a = Proxy | ||
| </ | </ | ||
| + | * example that solves the problem with Tagged | ||
| + | * NOTE: Proxy has a type parameter that is not used and does not even carry data. | ||
| + | * code <code Haskell> | ||
| + | module Main where | ||
| + | import qualified Data.Word as W | ||
| + | import qualified Octetable as Oct | ||
| + | import qualified Data.Tagged as Tg | ||
| + | |||
| + | main :: IO () | ||
| + | main = | ||
| + | do | ||
| + | print ((getTaggedFunc (buildNRender :: Tg.Tagged MyData (String -> [W.Word8]))) " | ||
| + | |||
| + | getTaggedFunc :: Tg.Tagged g (String -> [W.Word8]) -> (String -> [W.Word8]) | ||
| + | getTaggedFunc (Tg.Tagged f) = f | ||
| + | |||
| + | data MyData = MyData Integer | ||
| + | |||
| + | data Construction model = Contains model | Error String | ||
| + | deriving Show | ||
| + | |||
| + | class Builder g where | ||
| + | build :: String -> (Construction g) | ||
| + | render :: (Construction g) -> [W.Word8] | ||
| + | buildNRender :: Tg.Tagged g (String -> [W.Word8]) | ||
| + | buildNRender = (render .) <$> applyTag build | ||
| + | where | ||
| + | applyTag :: f (c g) -> Tg.Tagged g (f (c g)) | ||
| + | applyTag = Tg.Tagged | ||
| + | |||
| + | instance Builder MyData where | ||
| + | build s = Contains (MyData (read s :: Integer)) | ||
| + | render (Contains (MyData n)) = Oct.toOctets n | ||
| + | render (Error _) = [] | ||
| + | </ | ||
| + | |||
| + | |||
| + | ===== ✎ ===== | ||
| + | ~~DISCUSSION~~ | ||
codesnippets/parametrictypeforanintermediatevaluewhencombiningfunctions.1619294758.txt.gz · Last modified: (external edit)
