2016-12-05 12 views
1

Yesodの本を読んだ後は、生の文字列のようなものではなく、タイプセーフなURLを使用するという考えで販売されています。私はちょうど完全なyesodライブラリを使用するのではなく、単純なget要求を試行していますが、カスタムURLデータ型の導出を定義するか、他の既存の最小限のURLライブラリを使用するのは簡単です。HaskellでNetwork.URLライブラリを使用する

私はHoogle上でこれを見つけた:

ながら

myothervar = "kittens" -- oh no, I defined this for something else 
parseRequest myothervar -- and called it from parseRequest! 

、コンパイラによってキャッチされますようなミスはするよう、それは、私が欲しいの検証の種類を行いますよう https://hackage.haskell.org/package/url-2.1.3/docs/Network-URL.html

らしいです

myurl = "http://example.com" 
parseRequest myurl 

...大成功です。

ghci λ> import Network.URL 
ghci λ> myurl = importURL "http://example.com" 

ドキュメントは、私がimportURL

ghci λ> :t myurl 
myurl :: Maybe URL 

グレートを使用する必要が私に提案し、私はMaybeデする方法を知って、私はJustを使用しています。

ghci λ> exportURL $ Just myurl 

<interactive>:47:13: error: 
    • Couldn't match expected type ‘URL’ 
        with actual type ‘Maybe (Maybe URL)’ 
    • In the second argument of ‘($)’, namely ‘Just myurl’ 
     In the expression: exportURL $ Just myurl 
     In an equation for ‘it’: it = exportURL $ Just myurl 

ghci λ> Just (Just (URL {url_type = Absolute (Host {protocol = HTTP False, host = "example.com", port = Nothing}), url_path = "", url_params = []})) 

それは私のジャストを削除していない、それはちょうど別のジャストを追加。 parseRequestが引数として取る文字列を取得するにはどうすればよいですか?

そして私は間違いなく解除多分にそれを何とかバックStringにエクスポートすることにより、必要なように見える:

ghci λ> import Network.HTTP.Conduit 
ghci λ> parseRequest $ myurl 

<interactive>:84:16: error: 
    • Couldn't match type ‘Maybe URL’ with ‘[Char]’ 
     Expected type: String 
     Actual type: Maybe URL 
+1

Err、「Just」は「de-maybe」ではなく、「Maybe」タイプの2つのコンストラクタの1つです。実際には、値が 'Nothing'であれば、あなたは一般的には*できないでしょうか?出て行く値の中に「URL」はありません。値が本当に 'Just'になると確信が持てば、' fromJust'を使うことができますが、それは非常に注意して使用してください!その値が 'Maybe 'を使用するという全体の型安全ポイントを放棄するだけではなく、実行時にプログラムをクラッシュさせます。 –

+1

"不都合"の問題では、 'Maybe'値を構築する関数として' Just'を混在させているかもしれません(例えば、あなたを驚かせた型の不一致)。等号の左側にある)。 'Maybe'値を扱う方法の提案については、[*" Just "*を含むMaybeからのリターンでの操作(http://stackoverflow.com/q/3375483/2751851)が良いスタートです。 – duplode

答えて

2

ここで議論する価値が物事のカップルがあります。

OKは、何?それは私のジャストを削除していない、それはちょうど別のジャストを追加。 parseRequestが引数として取るStringをどのように取得できますか?

Maybe URL型を持つ何かを覚えておいてくださいNothingurl :: URLJust urlのいずれかです。 URLの一部を "抽出"することはできません。Maybeの全体のポイントがである場合、URLにはすべてが含まれていない可能性があります。

parseRequestが引数として取る文字列を取得するにはどうすればよいですか?

これは不要です - parseRequestimportURLと同じことをやっている - それだけでURLが適切に形成されていることを確認しています。唯一の違いは、MonadThrowからthrowMを使用してエラーをスローすることによってエラーを通知することです。さらに、http-conduitを使用したい場合は、を持っていることには全く意味がありませんので、parseRequestを使用してRequestを取得する必要があります。

URLが悪いと心配している場合は、コードをcatchに改行してください。

import Network.Connection (TLSSettings (..)) 
import Network.HTTP.Conduit 

main :: IO() 
main = catch (do 
       request <- parseRequest "https://github.com/" 
       let settings = mkManagerSettings (TLSSettingsSimple True False False) Nothing 
       manager <- newManager settings 
       res <- httpLbs request manager 
       print res) 
      (\e -> case e of 
         HttpExceptionRequest{} -> putStrLn "Http request failed" 
         InvalidUrlException{} -> putStrLn "Bad URL") 
関連する問題