Bool型は、言語の基本的な構成要素の1つです。何かが真か偽かを表すための型で、それぞれTrueとFalseという値を使います。
真偽値は、&&の「AND」演算子と||の「OR」演算子で組み合わせることができ、not関数で否定できます。
真偽値は、特定の条件が満たされたときだけ実行される分岐をコードに作るときにも、とても役立ちます。Elmでは、これはif-then-else式で行います。使い方は次のとおりです。
if someCondition || (someOtherCondition && anotherCondition) then
doSomething
else
doSomethingElse
この演習では、友人が開発している新しいRPGゲームのクエストのロジックを実装します。ゲームの主人公はAnnalyn。勇敢な女の子で、獰猛で忠実な飼い犬を連れています。ところが不幸にも、森で木の実を探していた親友が誘拐されてしまいました。Annalynは親友を見つけて解放しようとし、このクエストには飼い犬を連れていくこともできます。
親友の足跡をたどった末に、Annalynは親友が囚われている野営地を見つけます。誘拐犯は二人いました。強力な騎士と、ずる賢い射手です。
誘拐犯を見つけたAnnalynは、次のうちどの行動が取れるかを考えます:
取り組むタスクは5つです。森で見つけた3人の登場人物の状態と、Annalynが飼い犬を連れているかどうかに基づいて、上記の行動が可能かどうかを判断するロジックを実装します。
騎士が起きているかどうかを示す真偽値を受け取るcanFastAttack関数を実装しましょう。この関数は、騎士の状態に基づいて速攻攻撃ができる場合にTrueを返します。そうでなければFalseを返します:
knightIsAwake = True
canFastAttack knightIsAwake
--> False
騎士、射手、囚人がそれぞれ起きているかどうかを示す3つの真偽値を受け取るcanSpy関数を実装しましょう。この関数は、3人の登場人物の状態に基づいて一行をスパイできる場合にTrueを返します。そうでなければFalseを返します:
knightIsAwake = False
archerIsAwake = True
prisonerIsAwake = False
canSpy knightIsAwake archerIsAwake prisonerIsAwake
--> True
射手と囚人がそれぞれ起きているかどうかを示す2つの真偽値を受け取るcanSignalPrisoner関数を実装しましょう。この関数は、2人の登場人物の状態に基づいて囚人に合図を送れる場合にTrueを返します。そうでなければFalseを返します:
archerIsAwake = False
prisonerIsAwake = True
canSignalPrisoner archerIsAwake prisonerIsAwake
--> True
4つの真偽値を受け取るcanFreePrisoner関数を実装しましょう。最初の3つの仮引数は、騎士、射手、囚人がそれぞれ起きているかどうかを示します。最後の仮引数は、Annalynが飼い犬を連れているかどうかを示します。この関数は、3人の登場人物の状態とAnnalynが飼い犬を連れているかどうかに基づいて囚人を解放できる場合にTrueを返します。そうでなければFalseを返します:
knightIsAwake = False
archerIsAwake = True
prisonerIsAwake = False
petDogIsPresent = False
canFreePrisoner knightIsAwake archerIsAwake prisonerIsAwake petDogIsPresent
--> False
Annalynに見つかったかどうかを示す真偽値を受け取るstealthAttackDamage関数を実装しましょう。この関数は、見つかった場合は7を返し、そうでなければ12を返します。
annalynIsDetected = True
stealthAttackDamage annalynIsDetected
--> 7