質問

仕様

GHC6.12.1

Mac OS X 10.6.4 x64

MacBook Pro

問題

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

module Main where

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

タブ入力してみました y = 2 そして z = 3 さらにもっと。サイコロはありません。

(望ましくない) 解決策

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

  1. ハードタブをスペースに置き換えます。
  2. 交換する let を含む条項 where 句。
役に立ちましたか?

解決

Saizanは#haskellにlet式での割り当てを整列するために持っている、の を聞かせていないことを自分自身を説明しています。限り割り当てがラインアップとして、それはハードのタブまたはソフトタブを使用しても大丈夫です。

正しいコード:

module Main where

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

他のヒント

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

そのため、Haskellではタブを使用しないでください。彼らだ悪ます。

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

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

個人的に、私はそれぞれの行の末尾にセミコロンを置く

module Main where

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

あなたは、あなたのソースにタブ文字で次のコンパイルを主張する場合:

module Main where

main =
    let x = 1
        y = 2
        z = 3
    in putStrLn $ "X = " ++ show x ++ "\nY = " ++ show y ++ "\nZ = " ++ show z
すべての先頭の空白が1つまたは2つのタブ、letx = 1間の空白である

はまた、TABです。タブや行末を明示的にするためのVIのリストモードの中で見て:

module Main where$
$
main =$
^Ilet^Ix = 1$
^I^Iy = 2$
^I^Iz = 3$
^Iin putStrLn $ "X = " ++ show x ++ "\nY = " ++ show y ++ "\nZ = " ++ show z$

あなたがスペースに切り替える場合はあなたの人生ははるかに簡単とあなたのコードをきれいになります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top