[Haskell-cafe] Byte Histogram

wren ng thornton wren at freegeek.org
Fri Feb 11 08:06:24 CET 2011


On 2/8/11 6:00 AM, Ketil Malde wrote:
>> This does seem a bit excessive. As a start, I don't remember anyone
>> asking for control over (un)boxedness, so hopefully we could jettison
>> that part of it?
>
> Uh, you mean like in IOUArrays, the UNPACK pragma, or
> -funbox-strict-fields?  Unboxing is an important optimization, but
> perhaps the current feature set suffices.

As another issue to bear in mind, there is a big difference between 
strict types and unpointed types (either as types themselves, or as 
function spaces).

Semantically we have lots of reasons for wanting unpointed types--- that 
is, types which do not have bottom as an inhabitant. And it is clear 
that pointed and unpointed versions are different types[1]. One of the 
major issues looming here is the fact that unpointed types may not form 
domains, wreaks havoc for the domain theory semantics people often use 
for laziness. But at the same time, removing bottom can make it much 
easier to reason about things.

Strict types are, semantically, the same as unpointed types. And since 
Haskell is non-total, strict types are the only possible exact 
implementation of unpointed types (though decent type-checkable 
approximations may exist). However, operationally, strict types and 
unpointed types are quite different. In strict types we know that the 
value has been evaluated to WHNF (or some other normal form) and 
therefore we can avoid the computational cost of checking to ensure that 
it's been evaluated. Whereas unpointed types may not have been evaluated 
already, we simply know that when we do evaluate them we won't get 
bottom. Thus, unpointed types can allow us to have our laziness and... 
er, eat it too.

The arguments for having unpointed types (as opposed to strict types) 
are the same as the arguments for having laziness in the first place. 
Conversely, the arguments for having strict types (as opposed to 
unpointed types) are the same as the arguments for having strictness 
annotations of any kind. Both have their place, but we should be clear 
about what our goals are before choosing one or the other. Personally 
I'd like to have both, because they fill different needs, and because 
it's easy to automate the conversion between them[2].


[1] Though conversion between them is easy. From unpointed to pointed is 
just a forgetful functor; from pointed to unpointed is the monad of 
evaluation.

[2] Functions of strict arguments can be lifted to functions of 
unpointed arguments by simple wrappers to force argument evaluation. 
With strictness analysis, it can be possible to optimize the wrapper 
away and to call the strict-typed version directly. This is sort of like 
the SPECIALIZE pragmas.

We can also lift functions of unpointed arguments into functions of 
pointed arguments by changing the return type of the function to allow 
for bottom to be returned. Note that this requires that we distinguish 
pointed and unpointed types, not just pointed and unpointed function 
spaces. This is a natural consequence of the fact that evaluation is a 
monad, but it makes things get really hairy really quickly. Then again, 
that complexity may be unavoidable since we'd like to be able to have 
functions return strict and unpointed values just like they can return 
unboxed values.

-- 
Live well,
~wren



More information about the Haskell-Cafe mailing list