>> There are many libraries to write function "takes an record has Foo >> and Bar and returns something." But writing type of the function is >> still difficult. I can't write such types using HList or records >> without reading documents. I think, using has, There's few effort to >> write such types. > > In which manner do you need to read less documentation to write: > > ] f :: Has Foo r => r -> ... > > Instead when using HList: > > ] f :: HasField Foo record fieldType => ...
HasField only gives projection function (hLookupByLabel), but Has gives projection, injection and modification function. If I want to write a generic function injecting a value into field Foo in a record by HList, I should read documentation more. >> I think `has' fits the needs of Haskellers who have the good habit of >> writing a type of a function before its definition. > > What does this mean exactly in terms of the type inference possible? Probably, yes. it's still fragile due to some reasons e.g. the behavior of UndecidableInstances language extension. > import Data.Has > data Foo = Foo; type instance TypeOf Foo = Int > data Bar = Bar; type instance TypeOf Bar = Int > f r = (Foo ^. r) + (Bar ^. r) *Main> :t f f :: forall s. (Contains (Labelled Foo Int) s, Contains (Labelled Bar Int) s) => s -> TypeOf Foo -nwn _______________________________________________ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe