Haskellで `JustString`が間違っている理由

VELVETDETH

こんにちは私はHaskellのParameterizedTypesトピックを自分で学んでいる間、些細なことですが疲れ果てた質問があります。これが私の質問です:

これがの定義であるように見えますMaybe

data Maybe a = Just a | Nothing

そして、私たちはこれを次のように使用します:

Just "hello world"
Just 100

しかし、なぜ型変数を取ることができないのですか?

例えば:

Just String
Just Int

私はこの問題がかなりばかであることを知っています、しかし私はまだそれを理解することができません...

左回り

まず、StringIntは型変数ではなく型(必要に応じて型定数)であることに注意してくださいしかし、それはあなたの質問の目的にとっては実際には重要ではありません。

重要なのは、Haskells型言語値言語の違いですこれらは一般的に離れて保たれます。StringandIntMaybeは型言語で生活し、"hello world"and100JustNothingは価値言語で生活します。それぞれが反対側について何も知りません。コンパイラは「値のこの記述がその型に属する」ことを知っているだけですが、実際には型はコンパイル時にのみ存在し、値は実行時にのみ存在します。

少し紛らわしい2つのこと:

  • タイプ言語と値言語の両方に存在する名前を持つことができます。最もよく知られているのは()、次のような単なる同義語タイプです。

    newtype Endo a = Endo { runEndo :: a -> a }
    

    しかし実際には、これらは2つの別個のエンティティです。型コンストラクターEndo :: *->*(これらについては以下を参照*)と値コンストラクターEndo :: (a->a) -> Endo aです。それらはたまたま同じ名前を共有していますが、スコープが完全に異なります。addTwo x = x + 2との両方を宣言する場合と同様にgreet x = "Hello "++xxシンボルの両方の使用は互いに関係がありません。

  • data構文は、交絡型と値に思えます。それ以外の場所では、タイプと値は常に、で区切る必要があります::。最も一般的なのは署名です。

         "hello world" :: String
         100           :: Int
         Just          :: Int -> Maybe Int
            {-hence-}Just 100 :: Maybe Int
         Nothing       :: Maybe Int
    
    foo :: (Num a, Ord a) => a -> Maybe a  -- this really means `forall a . (Num a, Ord a) => a -> Maybe a
    foo n | n <= 0     = Nothing
          | otherwise  = Just $ n - 1
    

    実際、data次の機能を有効にすると、その構文を使用して、より特徴的な方法で定義することもできます-XGADTs

    data Maybe a where
      Just    :: a -> Maybe a
      Nothing :: Maybe a
    

    ここ::でも、値レベル(左)とタイプレベルを明確に区別しています。


あなたは実際にそれをもう1つのレベルに上げることができます:上記の宣言はまた書くことができます

data Maybe :: * -> * where
  Just    :: a -> Maybe a
  Nothing :: Maybe a

ここMaybe :: * -> *の手段、「Maybe持っているタイプレベルのものであるようなもの * -> *」、すなわち、それは一種のタイプレベルの引数を取ります*(などInt)や種類別のタイプのレベルのものを返します*(ここでは、Maybe Int)。タイプが値に対してであるように、種類はタイプに対してです。

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

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

編集
0

コメントを追加

0

関連記事

分類Dev

KeyCodeがMozillaで間違っている

分類Dev

移行でdjangoが間違っている

分類Dev

MYSQLに保存されているファイル名が何らかの理由で間違っている

分類Dev

and演算子を使用した関数の累積でコードが間違っている理由

分類Dev

ベクトルの回転中に出力が間違っている理由を特定できません

分類Dev

コードが間違っている理由がわかりませんか?そしてそれは何が悪いのですか?

分類Dev

Haskell:なぜこのモナド変換が間違っているのですか?

分類Dev

HaskellとStateMonadの乱数シーケンス、何が間違っているのですか?

分類Dev

ラムダで何が間違っているのですか

分類Dev

関数で何が間違っているのですか?

分類Dev

私はSedで何が間違っているのですか

分類Dev

os.path.splitが間違って戻ってきているようです

分類Dev

Kerasの損失は間違っているようです-加重和が間違っています

分類Dev

なぜ1 === 1 === 1が間違っているのですか?

分類Dev

LinuxでQPrinterの解像度が間違っている

分類Dev

SimpleDateFormatで月の名前が間違っている

分類Dev

SQLの日付の比較がJavaで間違っている

分類Dev

SafariでjQuery.height()が間違っている

分類Dev

ChromeでAngularMaterialDatepickerの開始位置が間違っている

分類Dev

JSON.parse、何が間違っているのですか?

分類Dev

「zzz」-le「~~~」が間違っているのはなぜですか?

分類Dev

\ P {Cn}のどこが間違っているのですか?

分類Dev

["text"] == ["text"]が間違っているのはなぜですか?

分類Dev

JavaScriptでキャレットの位置が間違っている

分類Dev

x <= xが間違っているのはなぜですか?

分類Dev

XOR出力が間違っているのはなぜですか

分類Dev

この手順で私が間違っていること

分類Dev

Parallel.ForEachで何が間違っているのか

分類Dev

MongoDBで日付と時刻が間違っている

Related 関連記事

  1. 1

    KeyCodeがMozillaで間違っている

  2. 2

    移行でdjangoが間違っている

  3. 3

    MYSQLに保存されているファイル名が何らかの理由で間違っている

  4. 4

    and演算子を使用した関数の累積でコードが間違っている理由

  5. 5

    ベクトルの回転中に出力が間違っている理由を特定できません

  6. 6

    コードが間違っている理由がわかりませんか?そしてそれは何が悪いのですか?

  7. 7

    Haskell:なぜこのモナド変換が間違っているのですか?

  8. 8

    HaskellとStateMonadの乱数シーケンス、何が間違っているのですか?

  9. 9

    ラムダで何が間違っているのですか

  10. 10

    関数で何が間違っているのですか?

  11. 11

    私はSedで何が間違っているのですか

  12. 12

    os.path.splitが間違って戻ってきているようです

  13. 13

    Kerasの損失は間違っているようです-加重和が間違っています

  14. 14

    なぜ1 === 1 === 1が間違っているのですか?

  15. 15

    LinuxでQPrinterの解像度が間違っている

  16. 16

    SimpleDateFormatで月の名前が間違っている

  17. 17

    SQLの日付の比較がJavaで間違っている

  18. 18

    SafariでjQuery.height()が間違っている

  19. 19

    ChromeでAngularMaterialDatepickerの開始位置が間違っている

  20. 20

    JSON.parse、何が間違っているのですか?

  21. 21

    「zzz」-le「~~~」が間違っているのはなぜですか?

  22. 22

    \ P {Cn}のどこが間違っているのですか?

  23. 23

    ["text"] == ["text"]が間違っているのはなぜですか?

  24. 24

    JavaScriptでキャレットの位置が間違っている

  25. 25

    x <= xが間違っているのはなぜですか?

  26. 26

    XOR出力が間違っているのはなぜですか

  27. 27

    この手順で私が間違っていること

  28. 28

    Parallel.ForEachで何が間違っているのか

  29. 29

    MongoDBで日付と時刻が間違っている

ホットタグ

アーカイブ