-3

私は Haskell を学んでいて、型を理解したいと思っています。タイプのオブジェクトがあるとしますStore:

import Data.Map (Map)
import qualified Data.Map as Map

type Variable = String

data Value = IntVal  Int
           | BoolVal Bool

type Store = Map Variable Value

s変数の値を取得するために、このオブジェクトをどのように使用できますか?

そして、変数の値をに保存する方法はStore?

4

2 に答える 2

3

型宣言では、 の左側のトークン=は型の名前です。=定義コンストラクターの右側の値- その型のインスタンスを作成する関数。

失敗の可能性を表す単純な型である Maybe の定義を考えてみましょう (nullまたはnil多くの言語で表されます)。

data Maybe a = Just a | Nothing

これは、 と の 2 つのコンストラクタを持つ型JustですNothing

  • Justコンストラクターは成功を表します。ラップする値を表す任意の型の引数が必要です
  • コンストラクターはNothing引数を取りません。失敗を表します。

Maybeコンストラクタが 2 つあるため、Maybe値を構築する方法が 2 つあります。このような型は共用体型と呼ばれます。パターン マッチングを使用して共用体型から値を抽出します。パターン マッチングを可能にする言語構造がいくつかあります ( letandバインディングwherecaseステートメント、および関数変数バインディング)。以下ではJust、関数への引数の値を分解します。

fromJust :: Maybe a -> a
fromJust (Just x) = x

これが GHCI にロードされていると仮定します。ここではMaybe、コンストラクターを使用してのインスタンスを作成し、Justその値を再度取得します。

> let x = Just 20
> fromJust x

  20

パターン マッチングで型がどのように検索されるかを次に示します。定義Storeしたコンストラクターを使用して型のインスタンスを作成します。Map

> let m = Map "someVar" $ IntVal 0

Variable以下では、Map から値を抽出する関数を定義します。

getVariable :: Store -> Variable
getVariable (Map v _) = v

関数の適用:

> getVariable m

  "someVar"

うまくいけば、あなたが学んでいるリソースがこのことをすぐにカバーするでしょう. そうでない場合は、 Real World Haskellをお勧めします。

于 2013-02-05T06:23:54.510 に答える
2

使用例を次に示します。

s :: Store
s = fromList [("key1", IntVal 4), ("key2", BoolVal False)]

lookup "key1" s -- Just (IntVal 4)
lookup "key2" s -- Just (BoolVal False)
lookup "key3" s -- Nothing

s' :: Store
s' = insert "key3" (BoolVal True) s

lookup "key3" s' -- Just (BoolVal True)
于 2013-02-05T05:51:17.227 に答える