このHaskell関数の戻り値が定義された関数の戻り値と異なるのはなぜですか?

ゲランドOC

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 UserAPI1return users1適用されたときに型を返す関数である必要がありますServer UserAPI1しかし、それは実際にはを返す関数です[User]よくわかりません。関数の戻り値の型が、定義された関数の戻り値の型と異なるのはなぜですか?

ダニディアズ

server1 :: Server UserAPI1の場合、return users1は、適用されたときにタイプServerUserAPI1を返す関数である必要があります。

UserAPI1複合型です。これは、APIを説明するデータ構造(タイプレベルで存在する)と見なすことができます。ただし、実際にリクエストを処理するにはHandler、エフェクトの実行方法、フレームワーク関連するエラーの通知方法などを知っているが必要です。

ハンドラーの構造はAPIの説明によって明確に決定されますが、それらは完全に同じタイプではありません。ここServerからシーンに入ります。

Server「型族」と呼ばれるものです。タイプを他のタイプに変換します。用語ではなく、型で機能する関数と考えることができます。ServerAPIの説明をハンドラーの実際のタイプに変換します。ハンドラーは、URLの一部をパラメーターとしてキャプチャする場合など、パスの数によって異なります。

ghciには、タイプファミリーアプリケーションを「実行」してその結果タイプを検査するための非常に便利なコマンドがあります。それは呼ばれ:kind!ます:

:kind! Server UserAPI1
Handler [User]

したがって、server1を構築するとき、実際にはタイプの何かを構築していますHandler [User]のドキュメントHandlerを見ると、Monadインスタンスがあることがわかります。それがreturnここで機能する理由です。既知のUsersのリストを返す簡単なハンドラーを構築していますreturnHaskellでは、他の言語のような「早期終了」動作がないこと注意してください代わりに、モナドコンテキストに純粋な値を挿入するために使用されます。

場合はUserAPI1、実際に撮影したURLのパスからいくつかの値を、で返されるタイプは、Serverそれに応じて変化するであろう。

type UserAPI2 = "users" :> Capture "foo" Int :> Get '[JSON] [User]

値を取り、Handlerを返す関数になります

:kind! Server UserAPI2
Int -> Handler [User]

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

Chromeブラウザのconsole.log()と関数の戻り値が異なるのはなぜですか

分類Dev

Node js、Javascript:関数の戻り値が未定義なのはなぜですか?

分類Dev

戻り値と非戻り値のstd ::関数がキャスト可能であるのはなぜですか?

分類Dev

関数の戻り値が評価されないのに、マクロの戻り値が評価されるのはなぜですか?

分類Dev

setInterval()が関数の戻り値を返さないのはなぜですか?

分類Dev

関数の戻り値の型で引数の推論が許可されないのはなぜですか?

分類Dev

ユーザー定義の変換関数テンプレートが推定される戻り値の型を持つことができないのはなぜですか?

分類Dev

関数の引数と戻り値なしでRPCを定義する

分類Dev

再帰関数で戻り値が未定義になるのはなぜですか?

分類Dev

'noImplicitAny'が関数の戻り値に適用されないのはなぜですか?

分類Dev

関数内に2つの戻り値が必要なのはなぜですか?

分類Dev

このコードで「void関数の予期しない非void戻り値」が表示されるのはなぜですか

分類Dev

戻り値の型は同じでパラメーターが異なる別の関数に関数を送信することはできますか?

分類Dev

制御が戻りなしで関数の終わりから流れ出るとき、なぜまだ戻り値があるのですか?

分類Dev

整数の戻り値の型で定義されているのに、mainが戻り値の型の文字列で実行されるのはなぜですか?

分類Dev

newで呼び出された関数の戻り値の型を変更することは可能ですか?

分類Dev

戻り値の型の推定を通じて、関数の外部から関数の内部で定義された構造体にアクセスできるのはなぜですか?

分類Dev

関数の戻り値の配列とブール値なので、phpでのこの関数の戻り値の型は何ですか?

分類Dev

fun関数の戻り値が7ではなく8になるのはなぜですか?

分類Dev

関数の引数の型から定義されたマッピングに基づいて関数の戻り値の型を定義することは可能ですか?

分類Dev

関数の戻り値をconst内に保存することは定義されていません

分類Dev

関数に複数の戻り値の型が迅速にあるのはなぜですか?

分類Dev

Cで指定された戻り値の型のない関数

分類Dev

関数の戻り値は自動オブジェクトなので、破壊されることが保証されていますか?

分類Dev

変数の異なる動作と関数の戻り値

分類Dev

(Haskellの)foldr関数の戻り値とそれが得る引数は何ですか?

分類Dev

TypeScriptが関数の戻り値の型のチェックに失敗するのはなぜですか

分類Dev

Javaで戻り値の型が予期されない場合の関数からの戻り値の処理

分類Dev

再帰関数が戻りながら最新の値を取得するのはなぜですか?

Related 関連記事

  1. 1

    Chromeブラウザのconsole.log()と関数の戻り値が異なるのはなぜですか

  2. 2

    Node js、Javascript:関数の戻り値が未定義なのはなぜですか?

  3. 3

    戻り値と非戻り値のstd ::関数がキャスト可能であるのはなぜですか?

  4. 4

    関数の戻り値が評価されないのに、マクロの戻り値が評価されるのはなぜですか?

  5. 5

    setInterval()が関数の戻り値を返さないのはなぜですか?

  6. 6

    関数の戻り値の型で引数の推論が許可されないのはなぜですか?

  7. 7

    ユーザー定義の変換関数テンプレートが推定される戻り値の型を持つことができないのはなぜですか?

  8. 8

    関数の引数と戻り値なしでRPCを定義する

  9. 9

    再帰関数で戻り値が未定義になるのはなぜですか?

  10. 10

    'noImplicitAny'が関数の戻り値に適用されないのはなぜですか?

  11. 11

    関数内に2つの戻り値が必要なのはなぜですか?

  12. 12

    このコードで「void関数の予期しない非void戻り値」が表示されるのはなぜですか

  13. 13

    戻り値の型は同じでパラメーターが異なる別の関数に関数を送信することはできますか?

  14. 14

    制御が戻りなしで関数の終わりから流れ出るとき、なぜまだ戻り値があるのですか?

  15. 15

    整数の戻り値の型で定義されているのに、mainが戻り値の型の文字列で実行されるのはなぜですか?

  16. 16

    newで呼び出された関数の戻り値の型を変更することは可能ですか?

  17. 17

    戻り値の型の推定を通じて、関数の外部から関数の内部で定義された構造体にアクセスできるのはなぜですか?

  18. 18

    関数の戻り値の配列とブール値なので、phpでのこの関数の戻り値の型は何ですか?

  19. 19

    fun関数の戻り値が7ではなく8になるのはなぜですか?

  20. 20

    関数の引数の型から定義されたマッピングに基づいて関数の戻り値の型を定義することは可能ですか?

  21. 21

    関数の戻り値をconst内に保存することは定義されていません

  22. 22

    関数に複数の戻り値の型が迅速にあるのはなぜですか?

  23. 23

    Cで指定された戻り値の型のない関数

  24. 24

    関数の戻り値は自動オブジェクトなので、破壊されることが保証されていますか?

  25. 25

    変数の異なる動作と関数の戻り値

  26. 26

    (Haskellの)foldr関数の戻り値とそれが得る引数は何ですか?

  27. 27

    TypeScriptが関数の戻り値の型のチェックに失敗するのはなぜですか

  28. 28

    Javaで戻り値の型が予期されない場合の関数からの戻り値の処理

  29. 29

    再帰関数が戻りながら最新の値を取得するのはなぜですか?

ホットタグ

アーカイブ