Haskellタイプの署名とモナド

smac89

リストのサイズとともにリストを取得することになっている関数をhaskellで作成しました。そして、指定されたサイズでData.Vector.Mutable.MVectorを作成し、リストの内容をベクトルに入力して、このベクトルを返すことになっています。

TL; DR

  • 提供した型署名が機能しなかった理由を知りたいのですが。タイプシグニチャとして受け入れられないようにするために、これに何が欠けていますか?
  • タイプシグネチャを使用しながら、上記で指定したことを実行する関数を作成することはできますか?
  • 私が書いたコードに基づいてコンパイラによって生成された型シグネチャをどのように解釈しますか?

これは機能です:

vecFromList lst sz = MV.new sz >>= (\vec -> fillV (zip [0..sz - 1] lst) vec) where
  fillV [] vec = vec 
  fillV ((i, v):xs) vec = MV.write vec i v >> fillV xs vec

そのほとんどは、彼らが何をしているのか(最後の行)を実際に理解しようとせずに書いたものであり、その結果、適切な型の署名を思い付くことができません。しかし、コンパイラーはこれでその日を救うために介入しました:

コンパイラが生成した型シグネチャ

vecFromList
  :: (PrimMonad (MVector t), PrimState (MVector t) ~ t) =>
     [b] -> Int -> MVector t b

誰かがワットと言うのを聞きましたかとにかく、それは私だけでした...コンパイルを試みる前に、これは私が機能するはずだと思ったタイプシグネチャです。

私が思ったものはうまくいくはずです

vecFromList :: PrimMonad m => [t] -> Int -> MV.MVector (PrimState m) t

この時点で、私が関数に実行させたいこととまったく同じように見えるこのやや単純な外観の型シグネチャが実際には機能しないことは明らかです。型シグニチャを思い付くために、私はベクトルモジュール内の他のいくつかの関数の型シグニチャを使用していました。たとえば、次のようなものです。

Data.Vector.Mutable.read
  :: PrimMonad m => MVector (PrimState m) a -> Int -> m a

今、私はまだhaskellに比較的慣れていないので、言語で使用される記号や記号に慣れようとしています。特に、単純なタスクのように見えるものが、モナンドのためにこのように複雑なものにならなければならない理由を理解しようとしています。たとえば、MVectorこの種の目的は何MVector :: * -> * -> *:ですか?

cchalmers

もうすぐです。結果MVectorがモナドにある必要があることを除いて、型シグネチャが正しいことが期待されますm

vecFromList :: PrimMonad m => [t] -> Int -> m (MV.MVector (PrimState m) t)

fillV機能はタイプを持っている必要があります

fillV :: [(Int, t)]
             -> MV.MVector (PrimState m) t -> m (MV.MVector (PrimState m) t)

しかし、あなたはそれを型に付け[]ずにベクトルを与える場合です動作するバージョンは次のとおりです。returnm

vecFromList :: PrimMonad m => [t] -> Int -> m (MV.MVector (PrimState m) t)
vecFromList lst sz = MV.new sz >>= (\vec -> fillV (zip [0..sz - 1] lst) vec) where
  fillV [] vec          = return vec
  fillV ((i, v):xs) vec = MV.write vec i v >> fillV xs vec

と実用的な例:

> V.create $ vecFromList [1,2,3] 3
fromList [1,2,3]

関数を実際に変更するのvecはなくfillV、参照するだけあることに注意してください。明示的にループを作成する代わりに、for_から関数を使用できData.Foldableます。私は通常、可変のベクトルコードをdoブロックで記述します。これは、状況が明確になるためです。

vecFromList2 :: PrimMonad m => [t] -> Int -> m (MV.MVector (PrimState m) t)
vecFromList2 l n = do
  v <- MV.new n
  for_ (zip [0..n - 1] l) $ \(i,a) -> MV.write v i a
  return v

残念ながら、Haskellで可変ベクトルを操作するのは難しい場合があり、練習が必要です。TypedHolesPartialTypeSignaturesを使用する役立ちます。

ReasonMVectorにはPrimState mそれがあるので、STまたはで動作しIOます。あなたはそれの説明をここで見つけることができます

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

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

編集
0

コメントを追加

0

関連記事

分類Dev

モナド変換子タイプの署名を理解する

分類Dev

HaskellとPurityのモナド

分類Dev

Haskellでのバイナリデータのモナド解析

分類Dev

Haskell-署名とタイプのエラー

分類Dev

モナドと同じ名前のタイプを持つ

分類Dev

Haskellは複数のモナドとバインドします

分類Dev

Haskell-モナド変換子-インタプリタでの評価の数を制限する

分類Dev

Haskellで「f(a-> b)」タイプの署名とはどういう意味ですか?

分類Dev

Haskellで異なるタイプのモナドからの値を使用する方法

分類Dev

Haskell:モナドスタックはIOと[]でバインドします

分類Dev

Haskell-ランドモナドでの計算のタイムアウト

分類Dev

Haskellのデータ構造内にあるモナドへのバインド

分類Dev

RWSモナドでのテレタイプフリーモナドの解釈

分類Dev

Haskell:モナドのモナド

分類Dev

モナドコレクション、モナドタイプ、モナド操作の違いは何ですか?

分類Dev

Haskellタイプの署名の括弧の意味は何ですか?

分類Dev

Haskell州のモナド

分類Dev

Haskellモナドの内部

分類Dev

マッチングタイプとモナド。エラー

分類Dev

Haskell / Wreq-httpリクエストの複雑なタイプの署名に関するアドバイス

分類Dev

モナド結果タイプへの制約の追加

分類Dev

ネストされたモナドタイプのモナドインスタンスの実装

分類Dev

HaskellのモノイドとNum

分類Dev

ライターモナドとリストライターモナドの違いは何ですか

分類Dev

ScalazライターモナドとfilterM

分類Dev

haskell ADモジュール:モードタイプクラスの問題

分類Dev

モナドスタックの深いタイプと一致しませんでした

分類Dev

Haskellリストモナドとリターン()

分類Dev

Haskellタプルモナドは厳しすぎますか?

Related 関連記事

  1. 1

    モナド変換子タイプの署名を理解する

  2. 2

    HaskellとPurityのモナド

  3. 3

    Haskellでのバイナリデータのモナド解析

  4. 4

    Haskell-署名とタイプのエラー

  5. 5

    モナドと同じ名前のタイプを持つ

  6. 6

    Haskellは複数のモナドとバインドします

  7. 7

    Haskell-モナド変換子-インタプリタでの評価の数を制限する

  8. 8

    Haskellで「f(a-> b)」タイプの署名とはどういう意味ですか?

  9. 9

    Haskellで異なるタイプのモナドからの値を使用する方法

  10. 10

    Haskell:モナドスタックはIOと[]でバインドします

  11. 11

    Haskell-ランドモナドでの計算のタイムアウト

  12. 12

    Haskellのデータ構造内にあるモナドへのバインド

  13. 13

    RWSモナドでのテレタイプフリーモナドの解釈

  14. 14

    Haskell:モナドのモナド

  15. 15

    モナドコレクション、モナドタイプ、モナド操作の違いは何ですか?

  16. 16

    Haskellタイプの署名の括弧の意味は何ですか?

  17. 17

    Haskell州のモナド

  18. 18

    Haskellモナドの内部

  19. 19

    マッチングタイプとモナド。エラー

  20. 20

    Haskell / Wreq-httpリクエストの複雑なタイプの署名に関するアドバイス

  21. 21

    モナド結果タイプへの制約の追加

  22. 22

    ネストされたモナドタイプのモナドインスタンスの実装

  23. 23

    HaskellのモノイドとNum

  24. 24

    ライターモナドとリストライターモナドの違いは何ですか

  25. 25

    ScalazライターモナドとfilterM

  26. 26

    haskell ADモジュール:モードタイプクラスの問題

  27. 27

    モナドスタックの深いタイプと一致しませんでした

  28. 28

    Haskellリストモナドとリターン()

  29. 29

    Haskellタプルモナドは厳しすぎますか?

ホットタグ

アーカイブ