2017-06-01 122 views
1
isValid :: Position -> Bool 
isValid Position(x _) = x 
isValid Position(_ y) = y 
    | x 'elem' ['a'..'h'] && y 'elem' [1..8] = True 
    | otherwise = False 

我不斷收到此錯誤error: Parse error in pattern: x 我想寫告訴我一個給定的poisition是否有效與否的功能。其中x['a'..'h']y[1..8]哈斯克爾解析錯誤圖案

+0

「位置」類型的定義是什麼? – dfeuer

回答

2

| x 'elem' ['a'..'h'] && y 'elem' [1..8] = True 

x綁定。它完全沒有出現在

isValid Position(_ y) = y 

特別是。此外,您可能打算使用`elem`,而不是'elem'

I am trying to write a function that tells me whether a given poisition is valid or not. Where x is ['a'..'h'] and y is [1..8]

不是你寫的Position的定義,但它看起來這會是這樣的

data Position = Position Int Int                                  

isValid :: Position -> Bool 
isValid (Position x y) = x `elem` ['a'..'h'] && y `elem` [1..8] 

(它建立對我來說)。

+0

我仍然得到相同的錯誤 – Dave

+0

@Dave你還有另一個錯誤,在使用''elem''而不是''elem''',另外一個。查看更新的答案。 –

+3

@Dave當你對網站看起來很陌生時(至少通過你的代表),請注意你可以接受一個答案,但獨立提供任何答案對你有幫助。 JonPurdy似乎已經正確回答了你的問題,所以你可能想把它作爲感謝。 –

3

如這裏解釋:Syntax error on 'mod' Haskell

用於作爲中綴運算符使用反引號(重音符,U + 0060),而不是撇號使用命名函數的語法:

| x `elem` ['a'..'h'] && y `elem` [1..8] = True 
     ------     ------ 
    | otherwise = False 

此外,Position(x _)Position(_ y)不是有效模式 - 您可能打算使用(Position x _)(Position x y)。請注意0​​,因爲x不在您爲(Position _ y)寫的等式中。

(Position x _)會匹配所有的位置,所以我懷疑你打算:

isValid :: Position -> Bool 
isValid (Position x y) 
    | x `elem` ['a'..'h'] && y `elem` [1..8] = True 
    | otherwise = False 

或者更簡單地說:

isValid :: Position -> Bool 
isValid (Position x y) = x `elem` ['a'..'h'] && y `elem` [1..8] 
3

I keep getting this error error: Parse error in pattern: x I am trying to write a function that tells me whether a given position is valid or not. Where x is ['a'..'h'] and y is [1..8] .

其他的答案已經討論了什麼是錯誤的:你使用的後衛在沒有界限的條款中x

isValid Position(_ y) = y

,此外您使用引號來代替與elem功能反引號:

x 'elem' ['a'..'h'] 

所以嚴格的修復將是:

isValid :: Position -> Bool 
isValid (Position x y) 
    | x `elem` ['a'..'h'] && y `elem` [1..8] = True 
    | otherwise = False

因爲我們實際上會返回後衛的結果,我們不需要使用警衛並且可以將警衛折成一個表情:

isValid :: Position -> Bool 
isValid (Position x y) = x `elem` ['a'..'h'] && y `elem` [1..8]

儘管如此,sinc Ë我們這裏範圍和第二範圍內工作是整數,我們沒有在一系列使用elem,我們可以使用:

isValid :: Position -> Bool 
isValid (Position x y) = 'a' <= x && x <= 'h' && 1 <= y && y <= 8

對於很小的範圍內,有可能不會是太大的影響但elem工作在O(n)最壞的情況,而兩個邊界檢查工作在O(1)