URLを生成するためにブーメランを正しく使用する方法について少し混乱しています。私は、次のしている:単純な代数データ型のweb-routes-boomerang
data State =
AK | AL | AR | AZ | CA ... WY
data Sitemap
= Home
| State State
| Place State String
deriving (Eq, Ord, Read, Show, Data, Typeable)
$(derivePrinterParsers ''Sitemap)
sitemap ∷ Router Sitemap
sitemap =
( rHome
<> rState . state
<> rPlace . (state </> anyString)
)
state :: PrinterParser StringsError [String] o (State :- o)
state = xmaph read (Just . show) anyString
これが動作しているようですが、私はarticleId
のドキュメント内の1つでstate
の私の実装を比較するとき、彼らは反対のファッションで働いているように見える:
articleId :: Router ArticleId
articleId = xmaph ArticleId (Just . unArticleId) int
タイプはまったく異なり、反対方向に向かっているように見えますが、私のsitemap
が機能し、アプリケーションがURLを正しく処理します。
maybeState :: String → Maybe State
maybeState stateString = case reads stateString of
[(state, "")] -> Just state
_ -> Nothing
stateR :: Router State
stateR = xpure show maybeState
これはチェック型、それでもその定義についてundefined
に置き換えて、上記sitemap
で、rState . stateR
は動作しますが、rPlace . (stateR </> anyString)
しませんしません:私はそれがより次のようになりますだと思います。
私はこれを世話するライブラリ機能が十分にあると思われますが、私は見たことがありませんでした。
編集:ここでは型エラーのいくつかは、私が取得:
state = xpure show maybeState
について:state = undefined :: Router State
については
Main.hs:56:16:
Couldn't match expected type `State :-()'
with actual type `[Char]'
Expected type:() -> State :-()
Actual type:() -> String
In the first argument of `xpure', namely `show'
In the expression: xpure show maybeState
(このエラーがsitemap
定義である):
Main.hs:45:18:
Couldn't match expected type `String :-()' with actual type `()'
Expected type: PrinterParser
StringsError [String]() (State :- (String :-()))
Actual type: Router State
In the first argument of `(</>)', namely `state'
In the second argument of `(.)', namely `(state </> anyString)'
私には驚くべきである何、私は推測であり、しかし、それはあなたが今書くことができることを使用して:)
何もないよりはましです文字列から状態への変換は、状態から文字列への変換ではなく、失敗する可能性があります。私は 'read'を使ってちょっと汚いと感じます - ブーメランが私のために例外をスローする読み込みの可能性を処理していますか?文字列全体の代わりに2文字を引っ張るべきですか? –
ええ、あなたは実際にそこに読んで使ってはいけません。私はあなたが望むことをする新しいreadshowコンビネータを追加しました。 xmaphへの最初の引数は常に成功しなければなりません(別名、総関数です)。 おそらく 'xmaph'の最初の引数は' Maybe/Either'関数でなければなりません。たとえば、 'articleId'はintが負の値であれば失敗する可能性があります。もっと考えてみる必要があります。 これに対して、xmaphはfmapの双方向バージョンのようになり、fmapは単にa-> b'となります。しかし、それはなぜ我々が '(b - >たぶんa)'を持っているのかを説明していない。 – stepcut
恐ろしく、ありがとう! –