模式中的Haskell Parse错误

时间:2017-06-01 05:23:26

标签: haskell

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]

的位置

3 个答案:

答案 0 :(得分: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)。请注意x,因为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]

答案 1 :(得分:3)

  

我一直收到此错误错误:模式中的解析错误:x我正在尝试编写一个函数,告诉我给定的位置是否有效。 x['a'..'h']y[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]

尽管我们在这里使用范围而第二个范围是整数,但我们不必在范围内使用elem,我们可以使用:

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

对于如此小的范围,可能不会对性能产生太大影响,但elem适用于 O(n)最坏情况,而两个边界检查在 O(1)

答案 2 :(得分:2)

 <script type="text/javascript">
         google.charts.load('current',  {packages: ["corechart","calendar","table"]});      
        google.charts.setOnLoadCallback(drawChart);


          function drawChart()
          {
               var data = new google.visualization.DataTable();
               data.addColumn('string', 'Nama Barang');
               data.addColumn('number', 'Jumlah Transaksi');

                        data.addRows
                        ([
                              <?php
                              $coba = "";
                              $petik = "'";
                                  foreach ($dataPie_k as $row)
                                  {

                                    $coba = $coba."['$row->nama', $row->total],";
                                  }

                                      echo substr($coba,0,strlen($coba)-1);

                              ?>    
                        ]);



            var options = 
            {
              title: 'Rating 5', 
              is3D: true,
              legend: 'none',

              pieSliceText: 'label',

            };

            var chart = new google.visualization.PieChart(document.getElementById('piechart'));

            chart.draw(data, options);

            }
    </script>

| x 'elem' ['a'..'h'] && y 'elem' [1..8] = True 未绑定。

中根本没有出现
x
特别是

。此外,您可能打算使用isValid Position(_ y) = y ,而不是`elem`

  

我正在尝试编写一个函数,告诉我给定的poisition是否有效。其中x是[&#39; a&#39; ..&#39; h&#39;],y是[1..8]

你没有写出'elem'的定义,但似乎这就像是

Position

(为我而建)。