Haskell学習ノート-1.基本文法
2490 ワード
Haskellという穴を掘って、純粋な関数式環境で自分の関数式プログラミング思考を鍛えたいまず環境を話して、まずHaskell PlatformつまりGHC推薦Mac下HaskellというIDEをインストールして、GHCIのようなREPLの下で練習してもいいです.
基本演算子
Haskellの基本演算子は他の言語と似ています加減乗除+-*/ ブール演算子と非&||not 関係演算子=等しくない=/= 関数呼び出し
Haskellの関数呼び出しは、スペースを使用して
`(数字1の前のボタン)で関数を括って接尾辞関数として使用できます.
関数の定義
関数式プログラミング言語の特徴
Haskellという純粋な関数式言語では、Haskellでは定義だけが値を付けていないので、定義された値は修正できません.数学の変数と似ています.この変数はこの値の状態ではなく、値を表すことを意味します.したがって、純粋な関数式プログラミングでは、関数は数の計算結果を参照するしかなく、副作用はありません.いつでも同じパラメータcall関数で同じ結果が得られるので、first classとして適しており、他の言語の変数と同等の地位を得ることができます.
letキーワードは定数を宣言するために使用されますは、関数において他の関数 を呼び出すことができる.
きほんステートメント
if then else文
Haskellのif文は実際には式であり、ifごとにthenelseの2つの部分が必要であり、elseはオプションではありません.これにより、式には必ず戻り値があることが保証されます.
Haskellでは、似たような関数を区別するために、関数名の後に単一引用符'を付けることが多い.
ケース文
Case文は多値マッチングに使用できます
where文
パターンマッチング
guard
再帰
パターンマッチングとguardの違い:違いは、オブジェクトを対比し、ブール値を対比することです.
基本演算子
Haskellの基本演算子は他の言語と似ています
1+1
not True
not True == False
Haskellの関数呼び出しは、スペースを使用して
succ 8
succ
単一パラメータ関数を呼び出し、1つの数の後続のmin 8 9
min
を返します.`(数字1の前のボタン)で関数を括って接尾辞関数として使用できます.
9 `div` 3
関数の定義
関数式プログラミング言語の特徴
Haskellという純粋な関数式言語では、Haskellでは定義だけが値を付けていないので、定義された値は修正できません.数学の変数と似ています.この変数はこの値の状態ではなく、値を表すことを意味します.したがって、純粋な関数式プログラミングでは、関数は数の計算結果を参照するしかなく、副作用はありません.いつでも同じパラメータcall関数で同じ結果が得られるので、first classとして適しており、他の言語の変数と同等の地位を得ることができます.
letキーワードは定数を宣言するために使用されます
let doubleMe x = x + x
doubleMe 2
let doubleUs x y =
{- -}
let doublex = 2 * x
doubley = 2 * y
in doublex + doubley
let doubleUs x y = doubleMe x + doubleMe y
doubleUs 2 3
きほんステートメント
if then else文
Haskellのif文は実際には式であり、ifごとにthenelseの2つの部分が必要であり、elseはオプションではありません.これにより、式には必ず戻り値があることが保証されます.
let doubelSmallNumber x = if x > 100
then x
else doubleMe x
Haskellでは、似たような関数を区別するために、関数名の後に単一引用符'を付けることが多い.
ケース文
Case文は多値マッチングに使用できます
let isOneOrTwo x = case x of 1 -> "1:One"
2 -> "2:No Two"
otherwise -> "otherwise"
where文
let doubleUs x y = doublex + doubley
where doublex = 2 * x
doubley = 2 * y
パターンマッチング
let lucky 7 = "You are lucky"
let lucky x = "Sorry, you are not lucky"
lucky 7
lucky 8
--
foo 0 x = x + 1
foo 1 x = x - 1
foo 2 x = 0
guard
let mydiv x y
| y == 0 = "Can not divide"
| x / y > 10 = "first number is larger than the second number"
| x / y < 1 = "first number is less than the second number"
| otherwise = "almost equal"
再帰
-- guard
let mysum x y
| x > y = mysum y x
| x == y = x
| otherwise = x + mysum (x+1) y
パターンマッチングとguardの違い:違いは、オブジェクトを対比し、ブール値を対比することです.