2012-03-05 9 views
10

無限型が必要と思われるものを定義したいと思います。意図的にhaskellで無限型を定義する

必須:それは「食べる(+)foldlの(わずか5)3」のような任意の式だから、基本的に3

eat 3 = 3 
eat x = eat 

を返すために、「3」を除く引数だすべてを食べる機能「を食べます」 3に評価されます。しかし、ここでの問題は食べ物の種類です。それは何でしょうか?

私は実行中のコードにして得た最も近い:

newtype Rec = MakeRec (Int -> Rec) 

eat :: Int -> Rec 
eat x = MakeRec eat 


instance Show Rec where 
    show _ = "EAT" 

これは「6を食べる」ためではなく、「6 7を食べる」と私は置けば、それは動作しませんのためにいい作品(= 3を食べます3)その定義で。

ハスケルでもこれが可能かどうかはわかりません。コンパイラが "eat foldl 3 foldl"が無効であるかどうかをコンパイラが知ることができるように、以下の解決策に記載されているように、型情報が必要です。 。したがって、この問題に対する正確な解決策は不可能です。

答えて

21

これはできません。 Haskellでは無限型(データ型ではない)が明示的に禁止されており、必要なコードを生成するのが容易で、エラーが発生します(たとえば、try let foo = (42, foo) in foo)。

もちろん、newtypedataで作成することはできますが、コンストラクタ内外の値を明示的にラップしてラップ解除する必要があります。

これは明示的な設計上の決定です:無限型では、コンパイラが拒否したいと思う誤った表現が許されなければならず、より多くのプログラムが許可されなければならないので、以前は明白に型定義されたプログラム明示的な型の注釈を必要とするがあいまいになります。したがって、トレードオフが行われます。これは、そうでない場合よりも型システムから多くの助けを得ることの代償として、無限型のかなりまれな用途について明示することを要求します。

は型クラスを使用して、あなたのeat機能に似たものを定義する方法ですが、あなたはそれに3を得た場合にのみ、それは停止することはできません、言った:あなたはそれを3かできないを与えてくれたかどうかは、実行時にのみ決定され、コンパイル時に型が決定されます。

class Eat a where 
    eat :: a 

instance Eat Integer where 
    eat = 3 

instance (Eat r) => Eat (a -> r) where 
    eat _ = eat 

キャッチは、あなたがそれを使用する場合、正確に型を指定する必要があることです:

*Main> eat 1 foldr() 

<interactive>:6:1: 
    Ambiguous type variable `t0' in the constraint: 
     (Eat t0) arising from a use of `eat' 
    Probable fix: add a type signature that fixes these type variable(s) 
    In the expression: eat 1 foldr() 
    In an equation for `it': it = eat 1 foldr() 
*Main> eat 1 foldr() :: Integer 
3 
しかし、ここでは両方 Integer、そしてちょうどその引数を食べる関数とすることができるオーバーロードされた値です

Integerとなる可能性がありますが、同じ表現ではeat 1eat 1 foldrを同じように使用したのと同じように、別の関数でもかまいません。繰り返しますが、柔軟な型付けを行いますが、返す型を明示的に指定する必要があります。

オーバーロードされた数値リテラル(42Numのインスタンスのいずれかのタイプとすることができる)のように、過負荷状態に型クラスを考えてみてください。

+0

haskellの無限型は大丈夫です。 **技術的に**無限のタイプを使用していてもまだ動作していない回避策があるかどうかを知りたいのですが – Karan

+0

コメントを投稿したときと同じように答えを広げました。私はそれがその追加の質問に答えるのを助けることを願っています:) – ehird

+0

したがって、常に3を返し、任意のタイプ(a - >(b - > .. Integer)を食べる – Karan

関連する問題