codesnippets:parametrictypeforanintermediatevaluewhencombiningfunctions
This is an old revision of the document!
Parametric type for an intermediate value when combining functions
- example with the folling problem(s):
- function
buildNRenderhas an ambigious intermediate parametric type - the type of
buildNRenderhas no parametric type g involved at all- hence, it does not make sense to have
buildNRenderas a member ofclassBuilder
- code
module Main where import qualified Data.Word as W import qualified Octetable as Oct main :: IO () main = do print (buildNRender "123") 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 :: String -> [W.Word8] buildNRender = render . build instance Builder MyData where build s = Contains (MyData (read s :: Integer)) render (Contains (MyData n)) = Oct.toOctets n render (Error _) = []
- example that solves the problem
- code
{-# LANGUAGE AllowAmbiguousTypes, TypeApplications, ScopedTypeVariables #-} module Main where import qualified Data.Word as W import qualified Octetable as Oct main :: IO () main = do print (buildNRender @MyData "123") 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 :: forall g . Builder g => String -> [W.Word8] -- forall g . introduces the Scope of Type Variable g -- needs extension AllowAmbiguousTypes buildNRender = render . build @g -- @g is a Type Application instance Builder MyData where build s = Contains (MyData (read s :: Integer)) render (Contains (MyData n)) = Oct.toOctets n render (Error _) = []
You could leave a comment if you were logged in.
codesnippets/parametrictypeforanintermediatevaluewhencombiningfunctions.1619197353.txt.gz · Last modified: (external edit)
