haskell - Pattern matching in instances of Tofu [LYAH example] -
i'm playing weird tofu example lyah. i've little bit simplified eliminating record fields frank constructor, here it:
class tofu t tofu :: j -> t j data frank m = frank (m a) deriving (show) instance tofu frank tofu x = frank x
it's working , rather clear. want make value of type a
modified tofu
function. i've started expansion of value of x
in instance declaration:
instance tofu frank tofu (m y) = frank (m y)
as result i'm getting:
tofu.hs:13:15: parse error in pattern: m
ok, next i've tried actual pattern matching inside instance declaration:
instance tofu frank tofu (just y) = frank (just y)
as result i'm getting:
tofu.hs:16:15: couldn't match type `j' `maybe' `j' rigid type variable bound type signature tofu :: j -> frank j @ tofu.hs:16:9 expected type: j actual type: maybe in pattern: y in equation `tofu': tofu (just y) = frank (just y) in instance declaration `tofu frank'
so, question is: how work value of type a
in instance declaration of tofu? possible make failed examples working without modification of tofu class?
tl;dr: can not.
assume t
satisfies tofu t
. function type states
tofu :: j -> t j
which means
tofu :: forall j a. j -> t j -- t chosen class instance
so, it's caller gets choose j
, a
are. caller can pass [int]
or maybe char
or either string bool
(here j ~ either string
, a ~ bool
). function tofu
can not assume specific case, , must job using "general" operations.
how work value of type in instance declaration of tofu
there might no a
value. e.g.
data t = k int
since can instantiate tofu as
tofu :: t -> t t
we can call in tofu (k 6 :: t bool)
if there's no bool
around.
a similar argument holds for
data u = u (a -> int)
here u bool
contains function expecting bool
, instead of providing or "containing" it, loosely speaking.
Comments
Post a Comment