7

仕様

GHC 6.12.1

Mac OS X 10.6.4 x64

マックブックプロ

問題

let構文の使用に問題があります。次のコードはコンパイルを拒否します。

module Main where

main = let x = 1
        y = 2
        z = 3
    in putStrLn $ "X = " ++ show x ++ "\nY = " ++ show y ++ "\nZ = " ++ show z

タブを押してみましy = 2z = 3。サイコロはありません。

(望ましくない) 解決策

コードをコンパイルする唯一の方法は、次のいずれかです

  1. ハードタブをスペースに置き換えます。
  2. let句を句に置き換えるwhere
4

5 に答える 5

16

#haskellのSaizanは、let式の割り当ては、それ自体ではなく、整列する必要があると説明しています。割り当てが並んでいる限り、ハードタブまたはソフトタブを使用してもかまいません。

正しいコード:

module Main where

main = let
        x = 1
        y = 2
        z = 3
    in putStrLn $ "X = " ++ show x ++ "\nY = " ++ show y ++ "\nZ = " ++ show z
于 2010-08-09T01:30:24.013 に答える
11

タブのサイズが定義されていないため、タブを使用してインデントを正しく制御することはできません。

したがって、Haskell ではタブを使用しないでください。彼らは悪です。

于 2010-08-09T14:44:40.587 に答える
3

let ブロック内の各宣言を同じ程度にインデントします。また、「in」と「let」を同じレベルにインデントするのも良い形です。例えば..

main = let x = 1
           y = 2
           z = 3
       in putStrLn $ "X = " ++ show x ++ "\nY = " ++ show y ++ "\nZ = " ++ show z
于 2010-08-09T01:23:22.360 に答える
2

個人的には、各行の最後にセミコロンを入れます

module Main where

main = let x = 1 ;
           y = 2 ;
           z = 3 
in putStrLn $ "X = " ++ show x ++ "\nY = " ++ show y ++ "\nZ = " ++ show z
于 2012-07-08T20:11:49.543 に答える
1

ソースで TAB 文字を使用することを主張すると、次のようにコンパイルされます。

module Main where

main =
    let x = 1
        y = 2
        z = 3
    in putStrLn $ "X = " ++ show x ++ "\nY = " ++ show y ++ "\nZ = " ++ show z

ここで、先頭の空白はすべて 1 つまたは 2 つの TAB であり、 と の間の空白letx = 1TAB です。vi のリスト モードで表示して、TAB と行末を明示的にします。

module Main where $ 
$ 
main = $ 
^I let ^I x = 1 $ 
^I^I y = 2 $ 
^I^I z = 3 $ 
^I in putStrLn $ "X = " ++ show x ++ "\ nY = " ++ show y ++ "\nZ = " ++ show z $

スペースに切り替えると、生活がよりシンプルになり、コードがよりきれいになります。

于 2010-08-09T15:35:00.447 に答える