2012-05-06 9 views
1

私はハスケルプロではありません。今日私は、今日のタイプシステムでやや奇妙な経験をしました。これの2行目は型エラーを引き起こします。問題は、二行目のmaxdiag (as:bs:cs:ds)ビットです:リストのリストで奇妙なことを確認してください

maxdiag ((a:as):(b:bs):(c:cs):(d:ds):xs) len = 
    maximum [a*(bs !! 0)*(cs !! 1)*(ds !! 2), maxdiag (as:bs:cs:ds) (len-1)] 

それは次のエラーで失敗します。それは

を読み取るように私は、 maxdiag (as:bs:cs:ds:xs)第2ラインの問題の一部を変更する場合

Occurs check: cannot construct the infinite type: a0 = [a0] 
Expected type: [[a0]] 
    Actual type: [a0] 
In the second argument of `(:)', namely `ds' 
In the second argument of `(:)', namely `cs : ds' 

maxdiag ((a:as):(b:bs):(c:cs):(d:ds):xs) len = 
    maximum [a*(bs !! 0)*(cs !! 1)*(ds !! 2), maxdiag (as:bs:cs:ds:xs) (len-1)] 

...エラーはありません。同様に、maxdiag (as:bs:cs:(ds:xs))と置き換えると成功します。私の質問は

  1. このエラーは何を意味していますか?
  2. どうしてですか?
  3. なぜこの2つの外見上異なるものがそれを修正していますか?

答えて

9

覚えておくべき事は(:)はタイプa -> [a] -> [a]を持っているということなので、2番目の引数はその要素の型を持つリストである一方、その最初の引数は、要素です。要素がそれ自身のリストである場合、これは[a] -> [[a]] -> [[a]]になります。あなたの例では

xs[[a]]型を持つ一方でasbscsdsすべては、タイプ[a]を持っているので、ds:xsがよく型付けされながらcs:dsはエラーです。

その特定のエラーメッセージの理由は、あなたが同じタイプbの二つのことに(:)を使用しようとするとb[b]と同じタイプであった場合、うまくいく唯一の方法であるということですが、それは無限になりますタイプは許可されていません。他の質問については

(:)演算子は右結合なので、as:bs:cs:ds:xsas:(bs:(cs:(ds:xs)))ともas:bs:cs:(ds:xs)と同じです。

5

エラー:

A.hs:2:63: 
    Occurs check: cannot construct the infinite type: a0 = [a0] 
    Expected type: [[a0]] 
     Actual type: [a0] 
    In the second argument of `(:)', namely `ds' 
    In the second argument of `(:)', namely `cs : ds' 

は、あなたが違法であるタイプ、上の再帰的な制約があることを意味します。私。あなたのタイプaa[a]の両方でなければなりません。

"occurs check"は、この時点で実行中のthe type checking algorithmの部分の技術名称です。 「発生チェック」は、無限に再帰的な型の構築を防ぎます。

私の経験では、リストのようなエラーが発生した場合、(:)(++)が混在しています。つまり、値をリスト要素として使用することもありますが、時にはリスト自体を値として使用することもあります。

この場合、式as:bs:cs:dsには(:)を使用しています。 - それはすべての回で本当であるには非常に低いですリストの要素の数や形状についての仮定をたくさん作る

[as,bs,cs,ds]++xs 

あなたのコードはかなり複雑であることに注意してください: は、おそらくあなたのような何かを意味します。私はこのコードを非常に恐れているだろう。

  • 使用パターンは、パターンマッチングとインデックス(!!)を交換以外の場合(例えば空のリスト、不足している要素)
  • を除外するためにマッチング:それははるかに安全になります。

あなたのアルゴリズムを簡略化する方法については難しいと思います。

+0

最後の段落の+1 – amindfv

+0

私は実際の質問を複雑にしたくないので、特にその機能に関する他の文脈は含まれていませんでしたが、それはパターンに関するものではありません。堅牢なプログラムの一部または何か、私はちょうどエラーのハングを取得するために型システムでめちゃくちゃしています。私は実際にこのようなコードを書くことはありません。 :P – apc

関連する問題