0

だから、私は少なくとも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 

mergeData.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、コードにプレリュードのようにTextaを「キャスト」していました。String私は実際に:: StringBsonパッケージで言及されているものを参照していると思っていましたが、(私が思うに)String実際にはコンストラクターであるため、とにかく完全に間違っていました。

以下がうまく機能するので、どういうわけかGHC型推論がどういうわけか混乱しているのではないかと思います。

testDocument :: Document
testDocument = [(fst ("asdf", "awef") :: Label) =: ("asdf" :: String)]

import Prelude hiding (String)編集:これは機能しますが、行を含めた後、エラーが発生するため、Bsonが適切な型処理を自動的に実行するためである必要があります。

だから私はついに質問を片付けました。以前の厄介なバージョンについては申し訳ありません-私はかなりイライラしました。

4

2 に答える 2

0

私はあなたの問題はではないと思いますLabel、それはb0です。snd vそうではないのに、それを主張しようとしているようですString。次のようなものを使用してみてください

tuplesToBSON xs = L.foldr (\acc v ->  [ ((fst v) :: Label) := (unpack (snd v) :: String)] ) [] xs

すべてのインライン型アサーションが何のためにあるのかはよくわかりませんが。これはおそらく次のように読みやすくなります

tuplesToBSON xs = L.foldr (\acc v -> [(fst v) := (unpack (snd v0)]) [] xs
于 2012-08-14T02:06:50.833 に答える
0

まず第一に、あなたが何をしようとしているのかが明確ではありません。アキュムレータ(acc)を使用していないため、これは縮退したトラバーサルです。あなたは言うかもしれません:

tuplesToBSON = (\v -> fst v =: snd v) . last

もう1つの問題は、タイプが明らかに矛盾していることです。Textラムダ内で変数を渡す必要があると明示的に述べていると言いますString。質問で言うように、型注釈を追加して、それらを強制操作と考えることはできません。変数の型は一貫している必要があり、強制は明示的な関数適用(unpackこの場合)によって行われます。

それで、それが単にフォルダの誤った使用であり、実際にアキュムレータを使用したいと仮定しましょう。Textさらに、そのタイプが必要であり、使用がString偶然であったと仮定しましょう。

3番目の問題は、変数が混同されているようですfoldr。2番目の引数は、最初の引数ではなく、アキュムレータです。したがって、次のようにする必要があります。

tuplesToBSON = foldr (\v acc -> (fst v =: snd v) : acc) []

そして、このタイプはうまくチェックします。etaの削減やその他のクリーンアップにより、コードとの類似性を確認するのが困難になる場合は、次のバージョンを検討してください。

tuplesToBSON xs = foldr (\v acc -> ((fst v :: Label) =: (snd v :: Text)) : acc ) [] xs
于 2012-08-14T03:08:51.030 に答える