haskell - Extending algebraic data type -


note: if question somehow odd, because exposed haskell , still adapting functional mindset.

considering data type maybe:

data myownmaybe = myownnothing | myownjust 

everyone using data type write functions like

maybetolist :: myownmaybe -> [a] maybetolist myownnothing  = [] maybetolist (myownjust x) = [x] 

now, suppose that, @ later time, wish extend data type

data myownmaybe = myownnothing | myownjust | superpositionofnothingandjust 

how make sure everyone's functions break @ compile-time?

of course, there chance somehow i'm not "getting" algebraic data types , maybe shouldn't doing @ all, considering data type action

data action = reset | send | remove 

it seem adding action add not uncommon (and wouldn't want risk having these functions around possibly cannot handle new action)

well, bad news first: can't it. period.

but language-agnostic; in language have break interface. there no way around it.

now, news: can go great length before have that.

you have consider export module. if, instead of exporting internal workings of it, export high-level functions, there chance can rewrite function using new data type, , go smooth.

in particular, careful when exporting data constructors. in case, don't export functions create data; exporting possibility of pattern-matching; , not ties pretty tight.

so, in example, if write functions like

myownnothing :: myownmaybe myownjust :: -> myownmaybe 

and

frommyownmaybe :: myownmaybe -> b -> (a -> b) -> b frommyownmaybe myownnothing b _ = b frommyownmaybe (myownjust a) _ f = f 

then it's reasonable assume able reimplement updated myownmaybe data type; so, export functions , data type itself, don't export constructors.

the situation in benefit exporting constructors when absolutely sure data type won't ever change. example, bool have 2 (fully defined) values: true , false, won't extended filenotfound or (although edward kmett might disagree). ditto maybe or [].

but idea more general: stay high-level can.


Comments

Popular posts from this blog

c# - Binding a comma separated list to a List<int> in asp.net web api -

Delphi 7 and decode UTF-8 base64 -

html - Is there any way to exclude a single element from the style? (Bootstrap) -