Haskell学習ノート-1.基本文法

2490 ワード

Haskellという穴を掘って、純粋な関数式環境で自分の関数式プログラミング思考を鍛えたいまず環境を話して、まずHaskell PlatformつまりGHC推薦Mac下HaskellというIDEをインストールして、GHCIのようなREPLの下で練習してもいいです.
基本演算子
Haskellの基本演算子は他の言語と似ています
  • 加減乗除+-*/1+1
  • ブール演算子と非&||not 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の違い:違いは、オブジェクトを対比し、ブール値を対比することです.