トップ «前の日記(2006-03-26) 最新 次の日記(2006-03-28)» 月表示 編集

日々の流転


2006-03-27 [長年日記]

λ. unboxed 1-tuple makes sense

<URL:http://article.gmane.org/gmane.comp.lang.haskell.prime/1022> で、こんなことが書かれてあるのを見かけて驚いた。

 

Mmm, not quite. Unboxed tuples are boxed tuples restricted such that they never have to be stored on the heap, but this has no effect on semantics at all. A function returning (# Double,Double #) may still return two thunks.

Yes, this is why the unboxed 1-tuple makes sense :-)

indexArray# :: Array# a -> Int# -> (# a #)

最初、どういう意味があるのかサッパリわからなかったが、<URL:http://www.haskell.org/ghc/docs/5.00/set/primitives.html> の説明を見て、なんとなく理解できた。

Something a bit more interesting goes on when indexing arrays of boxed objects, because the result is simply the boxed object. So presumably it should be entered—we never usually return an unevaluated object! This is a pain: primitive ops aren't supposed to do complicated things like enter objects. The current solution is to return a single element unboxed tuple (see Section 7.2.2).

indexArray#       :: Array# elt -> Int# -> (# elt #)
Tags: haskell

λ. Unboxed types have kind #.

GHC では unboxed type は # という種(kind)に属していることを偶然知った。<URL:http://www.haskell.org/haskellwiki/Unboxed_type> には表題の「Unboxed types have kind #.」と書いてある。普通の型と扱いを変えるには種を変えてしまうのが確かに一番自然か。

Prelude> :set -fglasgow-exts
Prelude> :kind (# Int, Int #)
(# Int, Int #) :: (#)
Prelude> :module +GHC.Base
Prelude GHC.Base> :kind Int#
Int# :: #
Prelude GHC.Base> :kind Double#
Double# :: #

もっとも、ソースコードに「forall (a:: #). a -> a」みたいな型を書こうとするとパースエラーになってしまう。unboxed type は多相的なものではないのでエラーになるのは当然だが、パースエラーとは酷いwww

Prelude> :kind (forall (a :: *). a -> a)
(forall (a :: *). a -> a) :: *
Prelude> :kind (forall (a :: #). a -> a)
<interactive>:1:14: parse error on input `#)'
Prelude> :kind (forall (a :: # ). a -> a)
<interactive>:1:14: parse error on input `#'
Tags: haskell