2011-07-22 7 views
9

私は自分自身をハスケルに教えることにしました。私はhttp://lisperati.com/haskell/のチュートリアルを見ていますが、これは私が見つけやすい最も簡単なものです。私がしようとしているのは、数字のリストを含むリストファイルの長さを表示するpeople.txtというテキストファイルです。このコードはチュートリアルの内容です。シンプルなHaskellプログラムによって 'パターンの不正な署名'エラーが発生する

import Data.List 

type Person = [Int] 

main = do 

    people_text <- readFile "people.txt" 
    let people :: [Person] 
      people = read people_text 

    putStr "Number of people " 
    putStr (length people_text) 

私はrunHaskellがをtutorial03.hs を持つファイルを実行しようとすると、私はこのエラーメッセージXScopedTypeVariablesフラグを使用して

tutorial03.hs:9:13: 
Illegal signature in pattern: [Person] people 
    Use -XScopedTypeVariables to permit it 

を取得し、私は

tutorial03.hs:10:17: Not in scope: type variable `people' 

を得る誰かが説明してもらえます私が間違ってやっていること。

+1

あなたのインデントです。型シグネチャと 'people'の定義がインデントの同じレベルにあることを確認してください。 – luqui

+0

@luqui - ありがとう..今、それは私に 'パースエラーon input ='を与えます。 – Christopher

+3

インデントでタブとスペースが混ざっていないことを確認してください。 – shang

答えて

24

インデントが問題であることをLuquiの権利。それは

あなたがパターンに型シグネチャを書く(および起動するように、関数名やパターン変数として両方 peopleを使用しているように確かに見えない
let people :: [Person] people = read people_text 

であるかのように、コンパイラは、あなたの定義を処理しています - 独特だが許される!)。

重要なことに、letは、のキーワードであり、すべて同じ水平位置にインデントする必要があります。署名の後にインデントされた行を追加することにより、実際の定義のために新しい行を開始するのではなく、署名付きの行を継続していることを示します。このようなレイアウト規則が気に入らなければ、ノイズの多いセミコロンを使うことができます。

あなたの定義は2行として処理する場合は、あなたのいずれかがpeopleの垂直...

let people :: [Person] 
    people = read people_text 

またはセミコロンで明示的に終わる行に信号を送るを並べるように注意する必要があります。

let people :: [Person] ; 
     people = read people_text 

私が最もHaskellersはちょうどこのように、read people_textのための型注釈ではなく、定義のための署名を供給するだろうと期待しておりものの、前者は、好ましくは次のようになります。

let people = read people_text :: [Person] 

を、あなたがいることを修正したらリストの長さは数字だが、putStrは文字列を出力するという事実と争う必要があるだろう。 printコマンドは、この目的のためにもっと便利かもしれません。

+0

ありがとう!それはそれをしました。私は次のエラーでもピックアップするために+2を与えることができれば幸いです:) – Christopher

1

これへの変更は、私の作品:

... 
    let people :: [Person] 
     people = read people_text 

... 
    print (length people_text) 
+0

私はそれを取得しません。変更は何ですか? – Christopher

+0

Nevermind - 豚労働者が垂直線を説明したが、今はそれを見る。 – Christopher

関連する問題