0

私はhttp-conduitライブラリを試していて、この簡単な例があります:

#!/usr/bin/env stack
{- stack
    --resolver lts-7.12
    --install-ghc
    runghc
    --package http-conduit
-}
{-# LANGUAGE OverloadedStrings #-}

import Network.HTTP.Conduit
import Data.ByteString.Lazy.Internal

getUrl :: IO (Data.ByteString.Lazy.Internal.ByteString) ---eeew!
getUrl = do
  resp <- simpleHttp "http://www.stackoverflow.com"
  return resp

この投稿から、[Char] または String よりも ByteString としての応答を優先する必要があることを理解しています。OverloadedStrings プラグマによってこの問題が軽減される可能性があると想定しましたが、私の out-type に関しては変化していないようです。

この関数は問題なく動作し、SO のホームページに対する単純な http 応答を忠実に出力しますが、その型シグネチャは非常に見苦しく見えます。

getUrl :: IO (Data.ByteString.Lazy.Internal.ByteString)

そして、インターネットの例からそのようなものはほとんど見られないと言わざるを得ません (楕円形の Java インポートよりも多くのドットがあります)。そうですか?応答を返したい場合、HXT、tagsoup、または attoparsec などを使用して解析を開始しますが、これは正しいアプローチまたは型シグネチャですか?

たとえば、別の URL を指定するなど、引数を取る機能を追加し始めると、これはさらに醜くなることに気付きました。

import Network.HTTP.Conduit
import Data.ByteString.Lazy.Internal

-- alright, first arg is now string for my url...
getUrl :: String -> IO (Data.ByteString.Lazy.Internal.ByteString)
getUrl url = do
  resp <- simpleHttp url
  return resp


main :: IO (ByteString)  -- what?!  inside the () ?
main = do
  getUrl "https://www.stackoverflow.com"

これは不健康に思えます。これを正しく構造化する方法をどのように理解すればよいですか?

4

1 に答える 1

2

修飾パスを使用して型をいつでも記述できます。ただし、既にインポートData.ByteString.Lazy.Internalしており、スコープ内に他のByteStringタイプ (厳密なものなど) がない限り、単に省略できますData.ByteString.Lazy.Internal:

getUrl :: IO ByteString

また、特に import する必要がない限り、 import するInternalことをお勧めしますData.ByteString.Lazy(使用している遅延型もエクスポートしByteStringます)。スコープに厳密と遅延の両方がある場合は、ByteStringそれらを修飾してインポートします。

 import qualified Data.ByteString as BS
 import qualified Data.ByteString.Lazy as BL

次にBS.ByteString、厳密なタイプと怠惰なタイプです。完全なorBL.ByteStringを書き出す必要はありません。Data.ByteString.ByteStringData.ByteString.Lazy.ByteString

また、Prelude と (そして互いに) 衝突する一連の関数を定義しているため、どちらのバイト文字列モジュールも通常は修飾されたインポートが最適であることに言及する価値があります (@duplode に感謝します)。

最後に、型を囲む括弧自体は何もしないことに注意してください。(ByteString)ByteString同一です。そのため、私はそれらを含めません。


あなたの質問とは関係ありませんが、モナドコードに関するいくつかのコメント:

  • みたいなことを書くたびに

    do x <- e
       return x
    

    だけで置き換えることができますe

  • みたいなことを書くたびに

    do e
    

    で置き換えることができますe

于 2016-12-12T01:48:02.013 に答える