2017-08-09 25 views
1

ケース変数全体を名前付けるパターン変数を使用すると、コンパイルと「式の無限型が推測された」というエラーが異なります。以下は、正しくコンパイル:しかしパターン変数によって推論される無限型

m = case Left "anything" of 
    [email protected](Left err) -> Left err 
    (Right f) -> case lookup "key" f of 
    Nothing -> Left "something else" 
    (Just x) -> Right x 

、我々はパターン変数e( "左ERR"、機能的に同等の電子を代入)、コンパイラフラグエラー使用している場合:

m = case Left "anything" of 
    [email protected](Left err) -> e 
    (Right f) -> case lookup "key" f of 
    Nothing -> Left "something else" 
    (Just x) -> Right x 

「無限を(式(key)を参照)f)...

StrMap t1とt1のマッチングが問題であることを理解しています。私はなぜこれが起こるのか分かりません。メッセージは無限型を全く指していませんでした。ここでは関係抽出物である:

retrieveDomeinResourceDefinition :: forall e. 
    ResourceId 
    -> Namespace 
    -> (AsyncDomeinFile e (Either String PropDefs)) 
retrieveDomeinResourceDefinition id ns = do 
    df <- retrieveDomeinFile (namespaceToDomeinFileName ns) 
    case df of 
    [email protected](Left err) -> pure $ e 
    (Right f) -> case lookup id f of 
     Nothing -> pure $ Left ("retrieveDomeinResourceDefinition: cannot find definition of " <> id <> " in DomeinFile for " <> ns) 
     (Just propDefs) -> pure (Right propDefs) 

retrieveDomeinFile :: forall e. Namespace -> AsyncDomeinFile e (Either String DomeinFile) 

newtype PropDefs = PropDefs (StrMap Json) 

が今ここにコンパイラが私に語った:「型と一致しませんでした:タイプStrMap PropDefsとPropDefs ...」コンパイラが検索式を気づいていないかのようにそれが表示されます。実際、「純粋な(右のpropDefs)」を「純粋な(右のf)」に置き換えると、エラーは消えてしまいます。

今、私はこれを書いています。「タイプt1とタイプStrMap t1を一致させようとしています」と「タイプと一致できませんでした:PropDefs with StrMap PropDefs」の類似点に気付きました。それでも、私はなぜeを使ってこの問題を引き起こすのか分かりません。

答えて

2

パターンマッチの値を機能的に同等にすることはできますが、タイプはありません。タイプシステムには、Rightのタイプ変数が無視されるという証拠はありません。あなたの第二の例では種類使用

- あなたのパターンマッチ[email protected](Left err)を、eの種類は、Either String DomeinFileになります - しかし、あなたはEither String PropDefsをしたいです。パターンマッチは右のタイプ変数を "解放"しません。そのため、再度エラーが発生したLeftを再構築する必要があります。

+0

です。私は間違って型組合(各組合の別の組合員)に分割されたと誤って考えましたが、それぞれのケースのタイプは組合全体です。 –

関連する問題