Haskellを学ぶためにこの簡単な使用人チュートリアルを読んでいます。コードは次のとおりです。
type UserAPI1 = "users" :> Get '[JSON] [User]
data User = User
{ name :: String
, age :: Int
, email :: String
, registration_date :: Day
} deriving (Eq, Show, Generic)
instance ToJSON User
users1 :: [User]
users1 =
[ User "Isaac Newton" 372 "[email protected]" (fromGregorian 1683 3 1)
, User "Albert Einstein" 136 "[email protected]" (fromGregorian 1905 12 1)
]
server1 :: Server UserAPI1
server1 = return users1
の場合server1 :: Server UserAPI1
、return users1
適用されたときに型を返す関数である必要がありますServer UserAPI1
。しかし、それは実際にはを返す関数です[User]
。よくわかりません。関数の戻り値の型が、定義された関数の戻り値の型と異なるのはなぜですか?
server1 :: Server UserAPI1の場合、return users1は、適用されたときにタイプServerUserAPI1を返す関数である必要があります。
UserAPI1
複合型です。これは、APIを説明するデータ構造(タイプレベルで存在する)と見なすことができます。ただし、実際にリクエストを処理するにはHandler
、エフェクトの実行方法、フレームワークに関連するエラーの通知方法などを知っているが必要です。
ハンドラーの構造はAPIの説明によって明確に決定されますが、それらは完全に同じタイプではありません。ここServer
からシーンに入ります。
Server
「型族」と呼ばれるものです。タイプを他のタイプに変換します。用語ではなく、型で機能する関数と考えることができます。Server
APIの説明をハンドラーの実際のタイプに変換します。ハンドラーは、URLの一部をパラメーターとしてキャプチャする場合など、パスの数によって異なります。
ghciには、タイプファミリーアプリケーションを「実行」してその結果タイプを検査するための非常に便利なコマンドがあります。それは呼ばれ:kind!
ます:
:kind! Server UserAPI1
Handler [User]
したがって、server1
値を構築するとき、実際にはタイプの何かを構築していますHandler [User]
。のドキュメントHandler
を見ると、Monad
インスタンスがあることがわかります。それがreturn
ここで機能する理由です。既知のUser
sのリストを返す簡単なハンドラーを構築しています。return
Haskellでは、他の言語のような「早期終了」動作がないことに注意してください。代わりに、モナドコンテキストに純粋な値を挿入するために使用されます。
場合はUserAPI1
、実際に撮影したURLのパスからいくつかの値を、で返されるタイプは、Server
それに応じて変化するであろう。
type UserAPI2 = "users" :> Capture "foo" Int :> Get '[JSON] [User]
値を取り、Handler
:を返す関数になります。
:kind! Server UserAPI2
Int -> Handler [User]
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加