だから、私は少なくとも1時間は壁に頭をぶつけてきました。これが私の問題です:
私の関数の1つはを返します[(Text, Text)]
。
Data.Bson
次に、このタプルのリストを使用してドキュメントにデータを入力します。
拡張機能OverloadedStrings
をオンにし、Data.Text
インポートしただけでなくData.Bson
、(この部分は、実際にはアキュムレータを使用しないコードのデバッグバージョンを貼り付けた元の投稿から編集されています):
tuplesToBSON :: [(Text, Text)] -> Document
tuplesToBSON xs = L.foldr (\v acc -> merge [fst v =: snd v] acc) [] xs
merge
Data.Bsonパッケージからはどこにありますか=:
。
運がない。Label
不平を言う:期待されるタイプを実際のタイプと一致させることができませんでしText
た。(以下はわかりやすくするための編集でもあります)試してみると:
tuplesToBSON xs = L.foldr (\v acc -> merge [(fst v) =: (String (snd v))] acc ) [] xs
残念ながら、この名前String
は実際には「Value」と呼ばれるデータ型のBsonパッケージのコンストラクター(私は思う...)です。 http://hackage.haskell.org/packages/archive/bson/0.2.1/doc/html/src/Data-Bson.html
これはまだ機能しませんが、別のエラーメッセージが表示されます。
No instance for (Val Value) arising from a use of `=:'
Possible fix: add an instance declaration for (Val Value)
In the expression: (fst v) =: (String (snd v))
In the first argument of `merge', namely `[(fst v) =: (String (snd v))]'
In the expression: merge [(fst v) =: (String (snd v))] acc
と同様:
Couldn't match expected type `Label' with actual type `Text'
Expected type: [(Label, text-0.11.2.0:Data.Text.Internal.Text)] Actual type: [(Text, Text)]
In the third argument of `L.foldr', namely `xs'
In the expression: L.foldr (\ v acc -> merge [(fst v) =: (String (snd v))] acc) [] xs
ValueがBsonパッケージのデータ型であることは知っていますが、実際には何Val
であるかわかりません。
=====今の無関係な部分の開始=====
そして、以下の回答の1つが指摘しているように、元の投稿では:: String
、コードにプレリュードのようにText
aを「キャスト」していました。String
私は実際に:: String
Bsonパッケージで言及されているものを参照していると思っていましたが、(私が思うに)String
実際にはコンストラクターであるため、とにかく完全に間違っていました。
以下がうまく機能するので、どういうわけかGHC型推論がどういうわけか混乱しているのではないかと思います。
testDocument :: Document
testDocument = [(fst ("asdf", "awef") :: Label) =: ("asdf" :: String)]
import Prelude hiding (String)
編集:これは機能しますが、行を含めた後、エラーが発生するため、Bsonが適切な型処理を自動的に実行するためである必要があります。
だから私はついに質問を片付けました。以前の厄介なバージョンについては申し訳ありません-私はかなりイライラしました。