2016-08-25 7 views

答えて

5

=は結合性である。名前を値/式にバインドします。 letブロックとwhereブロックでトップレベルのバインディングに使用します。

myfun x = let y = x + 1 
      in z y 
    where z n = n * n 

<-はモナド抽出である。それはdo記法の一部であり、モナドの内容に束縛された名前を導入する。

main = do 
    name <- getLine 
    putStrLn ("Hello, " ++ name) 

<=Cmp型クラスで定義された等しい少ないまたはオペレータです。

message x = if x < 18 then "No, you can't vote." else "Go ahead." 
+0

の部分的な重複それは非常に明確です!どうもありがとう!私は「トップレベルバインディング」が何であるか尋ねることができますか?トップレベルのバインディングと他のバインディングの違いは何ですか? –

+0

トップレベルのバインディングは、ファイルレベル(モジュールのwhereブロック)に直接存在するものです。他のバインディングとの唯一の違いは、その可視性です。 –

+0

私は* "モナド抽出" *は本当に "モナド結合" *であるべきだと思います。 –

10
  • =等しくなるように定義さを意味します。つまり、私は、ファイル内

    x = 5 
    

    どこかを記述する場合、私はその後、(同じ範囲内)の他の点でxその逆で5を置き換えることができます - 彼らは同じことです。 (そして、常に同じままになります。)の定義は、しかし、この場合においても

    ​​

    のような再帰的な計算を与えるために、あなたはそれを結合している名前に戻って参照することができ、あなたはまだ任意の時点でfibonacciを置き換えることができます0 : 1 : zipWith (+) fibs (tail fibonacci)で処理しますが、もちろん無限にプロセスを繰り返す必要があります。
    =定義は、モジュール内の独自のライン、すなわち、トップレベルのいずれかで立つことができ、又はlet又はwhereブロック内:ここ

    silly :: Integer -> Integer 
    silly x = y 
    where y = let z = x + 1 
          in z - 1 
    

    silly結合トップレベル(あります関数の引数で)、ywhereバインディングであり、zletバインディングです。

  • <-は、本質的に単項演算の結果を意味し、結果として定義されることを意味します。これは、これはユーザーが入力した文字列としてuserNameを定義していないだろう何

    main = do 
        putStrLn "Enter your name, please" 
        let userName' = getLine 
        putStrLn $ "Hello, " ++ userName' -- error here 
    

    とは非常に異なっているが、などということ

    main :: IO() 
    main = do 
        putStrLn "Enter your name, please" 
        userName <- getLine 
        putStrLn $ "Hello, " ++ userName 
    

    注:これは通常、例えば、doブロックに立っています文字列の入力を要求するアクションuserNameStringですが、userName' :: IO Stringです。

    <-

    も、リスト内包で使用されます。

    squareNums :: [Integer] 
    squareNums = [x^2 | x <- [0..]] 
    

    userName <- getLineは異なる何かをすることに見えるかもしれませんが、実際には、(代わりにIOのリスト)だけ異なるモナドでは、同じことを行います。実際、私も

    squareNums = do 
        x <- [0..] 
        return $ x^2 
    

    として本当に違う<-の第三の使用もありますことを書くことができます:pattern guardsが、これらはあまり一般的ではありません。

  • <=は、単なるライブラリ関数(インフィックス演算子形式)です。これはHaskellで遭遇する殆どのシンボリックな "構文"の場合にも当てはまります。そのような演算子についてはask Hayooとすることができます。<=defined in the Data.Ord moduleであり、比較演算子はそれほど同じではありません。
    ます。また、このようなオペレータを自分で定義することができます - これは再びビルトインされた - それは標準ライブラリにはまだなかった場合、私は簡単に署名で=>が完全に違うものであること。なお、

    (<=) :: Ord a => a -> a -> Bool 
    x <= y = not $ x > y 
    

    を定義することができます構文。今週はquestion about thatもありました。

関連する問題