String、Int、Listを表すために使用できるStructuredという構造データ型を作成したいと思います。たとえば、構造は次のようになります:[ Int、String、Int、[ Int ]]。
質問1:このデータ型を作成する方法は?
data Structured = ...
質問2:入力が制限を満たしていることを確認するConfirmという関数で、署名タイプはconfirm::制限->構造->MaybeBoolです。
String、Int、Listを表すために使用できるStructuredという構造データ型を作成したいと思います。たとえば、構造は次のようになります:[ Int、String、Int、[ Int ]]。
質問1:このデータ型を作成する方法は?
data Structured = ...
質問2:入力が制限を満たしていることを確認するConfirmという関数で、署名タイプはconfirm::制限->構造->MaybeBoolです。
data Structured = Structured Int String Int [Int]
動作します。
confirm :: (Structured -> Bool) -> Structured -> Bool
より賢明なタイプのようですが、のように簡単な実装がありid
ます。
Maybe Bool
評価関数から戻る必要はないと思いますMaybe a
。通常はを返す場合に適していますa
が、そうでない場合もあります。(たとえば、非常に単純なエラー処理に適しています。たとえばNothing
、エラーが発生した場合はgiveします。)この場合、入力が有効かどうかをいつでも結論付けることができるため、いつでも返すことができTrue
ますFalse
。Maybe
。
おそらくあなたは次のようなものを持つことができます
confirm :: (String -> Bool) -> (Int -> Bool) -> Structured -> Bool
confirm okString okInt (Structured int1 string int2 ints) =
all okInt (int1:int2:ints) && okString string
int1:int2:ints
これがのint1
前にあるリストint2
ですints
。
構造化を定義するもう少し良い方法は次のとおりです。
data Structured = Structured {
length ::Int,
name ::String,
width ::Int,
somenumbers :: [Int]}
その後、あなたは持っているだろう
confirm :: (String -> Bool) -> (Int -> Bool) -> Structured -> Bool
confirm okString okInt s =
all okInt (length s:width s:somenumbers s) && okString (name s)
これは最初のデータ宣言と同じ仕事をしますが、内部を取得するための関数を提供します。