1

ファイルから行ごとに読み取る関数を作成しようとしています。

readMyFile = do 
          contents <- readFile "input.txt"
          if(null sStringV == True)
                then do
                    let sStringV = lines contents
                    let sString = head sStringV
                    let sStringV = tail sStringV
                    return sString
                else do
                    let sString = head sStringV
                    let sStringV = tail sStringV
                    return sString

そして、sStringVをnullとして宣言しました

sStringV    = null

このコードをコンパイルすると、次のエラーが発生します。

Couldn't match expected type `[a0]' with actual type `[a1] -> Bool'
In the first argument of `null', namely `sStringV'
In the first argument of `(==)', namely `null sStringV'
In the expression: (null sStringV == True)

どこに問題があるのか​​ わかりません...

4

2 に答える 2

3

null関数[a] -> Boolであり、入力リストが空かどうかを返します。したがってsStringV、タイプは[a] -> Boolです。

ラインでif (null sStringV == True)

への引数は、関数自体nullではなく、リストでなければなりません。null

の宣言sStringVを次のように変更する必要があるようです

sStringV :: String
sStringV = ""

let sStringV = lines contentsただし、は新しい値を割り当てないことに注意してください。古い定義を隠すsStringV新しい変数を宣言するだけです。関数内からsStringV変更することはできません。sStringVreadMyFile

Haskell を命令型言語のように使用しようとしているようです。

于 2013-06-07T08:09:14.593 に答える
0

null() は、変数が null かどうかをテストしません。null() は、リストが空かどうかをテストします。キーワードはlistです。つまり、リストに対して null を呼び出す必要があります。したがって、次の 2 つの選択肢があります。

1) 空のリストで null() を呼び出すことができます:

null []  -->True

2) 何かを含むリストで null() を呼び出すことができます:

null [1, 2, 3]  --> False

また、次のように書くことに注意してください。

if(null sStringV == True)

冗長です。null() はリストを引数として取り、リストが空の場合は True を返し、リストに何かが含まれている場合は False を返します。したがって、書く必要があるのは次のとおりです。

if(null sStringV)
then do ....   --executed if sStringV is an empty list

else do ...    --excuted if sStringV is a list that contains something

次に例を示します。

dostuff:: [a] -> IO () 
dostuff alist = if null alist
                then putStrLn "hello"
                else putStrLn "goodbye"

ghci>:l 1.hs
[1 of 1] Compiling Main             ( 1.hs, interpreted )
Ok, modules loaded: Main.
ghci>dostuff []
hello
ghci>dostuff [1, 2, 3]
goodbye
ghci>
于 2013-06-07T08:31:27.153 に答える