Haskellタイプと一致できません

アンモルサフー

このトピックについて多くの質問があることは知っていますが、私が使用しているライブラリには、エラーを引き起こしている特定の何かがあると感じています。

module Test where

import Clash.Prelude

init' :: Vec (n + 1) a -> Vec n a
init' (_ :> Nil) = Nil
init' (x :> (xs:>ys)) = x :> (init' (xs:>ys))

私が得ているエラーは、

Test.hs:28:14: error:
    • Couldn't match type ‘n’ with ‘n0 + 1’
      ‘n’ is a rigid type variable bound by
        the type signature for:
          init' :: forall (n :: Nat) a. Vec (n + 1) a -> Vec n a
        at Test.hs:26:1-33
      Expected type: Vec n a
        Actual type: Vec (n0 + 1) a
    • In the pattern: xs :> ys
      In the pattern: x :> (xs :> ys)
      In an equation for ‘init'’:
          init' (x :> (xs :> ys)) = x :> (init' (xs :> ys))
    • Relevant bindings include
        init' :: Vec (n + 1) a -> Vec n a (bound at Test.hs:27:1)
   |
28 | init' (x :> (xs:>ys)) = x :> (init' (xs:>ys))
   | 

Clash.Preludeライブラリの定義は次のとおりです。

data Vec :: Nat -> * -> * where
  Nil  :: Vec 0 a
  Cons :: a -> Vec n a -> Vec (n + 1) a

pattern (:>) :: a -> Vec n a -> Vec (n + 1) a
pattern (:>) x xs <- ((\ys -> (head ys,tail ys)) -> (x,xs))
  where
    (:>) x xs = Cons x xs
KAビュール

これはClashライブラリのバグ/制限です。次のような単純なものを定義することすらできないことがわかります。

safeHead :: Vec n a -> Maybe a
safeHead Nil = Nothing
safeHead (x :> _) = Just x

問題は、(:>)パターンの定義です

pattern (:>) :: a -> Vec n a -> Vec (n + 1) a
pattern (:>) x xs <- ((\ys -> (head ys,tail ys)) -> (x,xs))
  where
    (:>) x xs = Cons x xs

初登場にもかかわらず、その署名は間違っています!代わりに、はるかに単純な(そして本質的に同等の)定義が与えられていたとしたら:

pattern (:>) x xs = Cons x xs

推測される型シグネチャは次のようになります。

pattern (:>) :: () => (n ~ n1 + 1) => a -> Vec n1 a -> Vec n a

(これも明示的に指定できます)、コードは正常に機能します(のCons代わりに直接使用できる場合と同じよう(:>)。

2セットの制約があるこのシグニチャの異常な形式は、パターンシノニムに固有です。制約の最初のセットは、「必須」制約のセットを提供します。これは、パターンを使用するコードがタイプが正しいと見なすために満たす必要がある制約です2つ目は、「提供された」制約のセットを示します。これらの制約は、実行時にパターンを実際に照合することにより、ケースブランチのスコープに組み込まれます。これについて詳しくは、GHCドキュメントのパターンシノニムの入力をご覧ください

残念ながら、ライブラリで使用されている明示的な署名は次のとおりです。

pattern (:>) :: a -> Vec n a -> Vec (n + 1) a

と同等です:

pattern (:>) :: (n ~ n1 + 1) => () => Vec n1 a -> Vec n a

どこの制約nn1「必要」の代わりに「提供」の制約セットに表示されます。これは大きな問題です!

の定義のこの部分ではinit'

init' (x :> (xs:>ys)) = x :> (init' (xs:>ys))

1つ目:> 、式全体で一致する引数がいくつかのx :> (xs :> ys)aVec (n + 1) aである必要がありますn幸いなことに、これの型シグネチャによるものinit'です。残念ながら、2番目の引数では、型チェックを行うために、引数(型であることがわかっている)が一部の引数である:> 必要がありますそのような制約はありません!このような制約提供するのは、(前の行のようにによる一致とは対照的に)この秒による一致です。Vec n aVec (m + 1) am:>Nil

最終的に、我々は提供するために、制約ループの一種で立ち往生しているn ~ m + 1いくつかのためにm、我々はすでに持っている必要がありますn ~ m + 1いくつかのためにm

それで、あなたは何ができますか?言うのが難しい。CHANGELOGforClashよると、この奇妙なパターン定義は意図的に追加されたため、「パターンマッチング:>はCLaSHコンパイラで合成できるようになりました」。これが何を意味するのかわかりませんが、Clashメンテナはおそらくそうしています。私は彼または彼女にメールを送り、のパターン定義は(:>)あなたが定義safeHeadやなどの単純なことをするの妨げることを指摘し、init'彼または彼女がパターンを書き直して適切なパターンマッチングを可能にし、これを「合成可能」に保つことができるかどうかを確認しますビジネス作業。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

Haskellはタイプと一致できません

分類Dev

Haskell:タイプ `[Char] 'と` Char'を一致させることができませんでした

分類Dev

Haskell-タイプ「PersistEntityBackendrecord0」を「SqlBackend」と一致させることができませんでした

分類Dev

Haskell-タイプ `(Int、Integer) 'を` Pos'と一致させることができませんでした

分類Dev

Haskellはタイプ `[] 'を` IO'と一致させることができませんでした

分類Dev

Haskell-タイプ[]をIOと一致させることができませんでした

分類Dev

Haskell:エラー:タイプ「[]」を「IO」と一致させることができませんでした

分類Dev

Haskell:タイプを一致させることができませんでしたか?

分類Dev

Haskell関数のタイプを一致させることができません

分類Dev

Haskellは奇妙な予想されるタイプと一致できませんでした

分類Dev

Haskell-期待されるタイプと一致しませんでした

分類Dev

Haskell howManyAboveAverageがタイプエラーと一致しませんでした

分類Dev

Haskell、Control.Lens:タイプ「[Language.Haskell.TH.Syntax.Dec]」を「Language.Haskell.TH.Syntax.Exp」と一致させることができませんでした

分類Dev

Haskell、Control.Lens:タイプ「[Language.Haskell.TH.Syntax.Dec]」を「Language.Haskell.TH.Syntax.Exp」と一致させることができませんでした

分類Dev

Haskell readFile:期待されるタイプ '[String]'を実際のタイプ 'IOString'と一致させることができませんでした

分類Dev

haskellでクラスタイプを特定のタイプと一致させることができません

分類Dev

Haskell:期待されるタイプ「a1」を実際のタイプ「a」と一致させることができませんでした

分類Dev

Haskellは期待されるタイプ「ItemNat」を実際のタイプ「()」と一致させることができませんでした

分類Dev

haskellは期待されるタイプを実際のタイプ 'Bool'と一致させることができませんでした

分類Dev

Haskell '期待されるタイプと実際のタイプを一致させることができませんでした'

分類Dev

Haskellタイプエラー「タイプ `Char 'と` t0 [Char]'を一致させることができませんでした」

分類Dev

Haskellは期待されるタイプ 'Bool'をタイプ[t0]に一致させることができません

分類Dev

haskell-タイプ '(Char、Int)'と '[Char]'エラーを一致させることができませんでした

分類Dev

Haskellエラーで期待されるタイプと一致しませんでした

分類Dev

Swift 2:タイプ「Bool」の式パターンはタイプ「Int」の値と一致できません

分類Dev

タイプ 'CountableClosedRange <Int>'の式パターンはタイプ 'Int'の値と一致できませんか?

分類Dev

タイプ 'String'の式パターンはタイプ 'NSStoryboardSegue.Identifierの値と一致できません

分類Dev

haskellのポリモーフィックタイプと一致しませんでした

分類Dev

Haskell関数の予想されるタイプと一致しませんでした

Related 関連記事

  1. 1

    Haskellはタイプと一致できません

  2. 2

    Haskell:タイプ `[Char] 'と` Char'を一致させることができませんでした

  3. 3

    Haskell-タイプ「PersistEntityBackendrecord0」を「SqlBackend」と一致させることができませんでした

  4. 4

    Haskell-タイプ `(Int、Integer) 'を` Pos'と一致させることができませんでした

  5. 5

    Haskellはタイプ `[] 'を` IO'と一致させることができませんでした

  6. 6

    Haskell-タイプ[]をIOと一致させることができませんでした

  7. 7

    Haskell:エラー:タイプ「[]」を「IO」と一致させることができませんでした

  8. 8

    Haskell:タイプを一致させることができませんでしたか?

  9. 9

    Haskell関数のタイプを一致させることができません

  10. 10

    Haskellは奇妙な予想されるタイプと一致できませんでした

  11. 11

    Haskell-期待されるタイプと一致しませんでした

  12. 12

    Haskell howManyAboveAverageがタイプエラーと一致しませんでした

  13. 13

    Haskell、Control.Lens:タイプ「[Language.Haskell.TH.Syntax.Dec]」を「Language.Haskell.TH.Syntax.Exp」と一致させることができませんでした

  14. 14

    Haskell、Control.Lens:タイプ「[Language.Haskell.TH.Syntax.Dec]」を「Language.Haskell.TH.Syntax.Exp」と一致させることができませんでした

  15. 15

    Haskell readFile:期待されるタイプ '[String]'を実際のタイプ 'IOString'と一致させることができませんでした

  16. 16

    haskellでクラスタイプを特定のタイプと一致させることができません

  17. 17

    Haskell:期待されるタイプ「a1」を実際のタイプ「a」と一致させることができませんでした

  18. 18

    Haskellは期待されるタイプ「ItemNat」を実際のタイプ「()」と一致させることができませんでした

  19. 19

    haskellは期待されるタイプを実際のタイプ 'Bool'と一致させることができませんでした

  20. 20

    Haskell '期待されるタイプと実際のタイプを一致させることができませんでした'

  21. 21

    Haskellタイプエラー「タイプ `Char 'と` t0 [Char]'を一致させることができませんでした」

  22. 22

    Haskellは期待されるタイプ 'Bool'をタイプ[t0]に一致させることができません

  23. 23

    haskell-タイプ '(Char、Int)'と '[Char]'エラーを一致させることができませんでした

  24. 24

    Haskellエラーで期待されるタイプと一致しませんでした

  25. 25

    Swift 2:タイプ「Bool」の式パターンはタイプ「Int」の値と一致できません

  26. 26

    タイプ 'CountableClosedRange <Int>'の式パターンはタイプ 'Int'の値と一致できませんか?

  27. 27

    タイプ 'String'の式パターンはタイプ 'NSStoryboardSegue.Identifierの値と一致できません

  28. 28

    haskellのポリモーフィックタイプと一致しませんでした

  29. 29

    Haskell関数の予想されるタイプと一致しませんでした

ホットタグ

アーカイブ