[Haskell-cafe] Overcome type restrictions?

Dušan Kolář kolar at fit.vutbr.cz
Fri Mar 7 09:39:59 UTC 2014


Yes, it is.

the reason is, as I think, the following

from application h t we can derive
t :: a
h :: t1 -> t2
after unification
t :: a
h :: a -> t2

now
(h:t)
t :: [e]
h :: e

merging
t:: a ~ [e] -> a == [e]
and it follows

h :: [e] -> t2
h :: e

which would give infinite type for unification.


Nevertheless, from the example it is obvious, that for particular case, 
it is fine.
We can explicitly type:

h :: [a] -> a
t :: [[a] -> a]

for (h:t) it is OK  h :: e ~ [a]->a  and  t :: [e] ~ [[a]->a]  e.g. e == 
[a]->a and h :: e and t ::[e], which is fine

Now, h t
h :: [a] -> a
t :: [[b] -> b]
and it is fine, as type a == [b] -> b
of course, monomorphism restriction would lead to infinite type again.

So, the question is, how for the particular case force the inference 
this way, to break the restriction...

Dušan



On 03/07/2014 09:33 AM, Vincent Beffara wrote:
>> We have and error of infinite type for
>> Prelude> :t ((\(h:t) -> h t) [head, last, head, last, head, last])
>>
>> Of course, head and tail are incompatible on type level...
>>> It seems like you need heterogenous collections[0]
> Well the error pops up much earlier than that, see:
>
> Prelude> :t (\(h:t) -> h t)
>
>>> Regards,
>>> Henk-Jan van Tuyl
>>>
>>>
>>> [0] http://www.haskell.org/haskellwiki/Heterogenous_collections
>>>
>>>
>>> -- 
>>> Folding at home
>>> What if you could share your unused computer power to help find a
>>> cure? In just 5 minutes you can join the world's biggest networked
>>> computer and get us closer sooner. Watch the video.
>>> http://folding.stanford.edu/
>>>
>>>
>>> http://Van.Tuyl.eu/
>>> http://members.chello.nl/hjgtuyl/tourdemonad.html
>>> Haskell programming
>>> --
>>>



More information about the Haskell-Cafe mailing list