2014-01-18 2 views
2

я написал следующую функцию в Haskellошибка синтаксического анализа на входе `=» в Haskell

coordenadas :: (Floating a) => String -> (a, a, a) 
coordenadas linea = (x, y, z) 
    where (_ : xStr : yStr : zStr : _) = words linea 
      x = read $ tail xStr :: Float 
      y = read $ tail yStr :: Float 
      z = read $ tail zStr :: Float 

Эта функция предназначена для получения строки, как "N1 X2 Y1 Z10" и произвести кортеж, как (2, 1, 10), но когда я пытаюсь скомпилировать его , компилятор говорит, что есть parse error on input '=' в строке x = read $ tail xStr :: Float.

Кто-нибудь знает, как его решить?

Спасибо за ответ.

+3

код компилируется нормально (ну, не совсем, так как 'x' имеет тип' Float' и ваш тип подписи указывает, что он должен иметь тип ' Floating a => a'), но нет ошибки синтаксического анализа, на этой строке или любом другом. – user2407038

+3

Я уверен, что это проблема с отступом, но можете ли вы привести пример допустимого значения 'linea'? –

+0

Спасибо, это была, по сути, проблема с отступом. Я новичок в Haskell. – Adrian

ответ

5

Я получил это работает:

coordinates :: String -> (Float, Float, Float) 
coordinates line = (x,y,z) 
    where (_ : xStr : yStr : zStr : _) = words line 
      x = read $ tail xStr :: Float 
      y = read $ tail yStr :: Float 
      z = read $ tail zStr :: Float 

main = do 
    let line = "test x1.0 y1.0 z1.0 test" 
    print $ coordinates line 

Это выводит (1.0, 1.0, 1.0), как и ожидалось.

Я вроде новичок в Haskell себя, так что я понятия не имею, почему это это требователен отступов (и был бы признателен указатели от людей, которые знают больше, чем я!), Но, видимо, правильный способ:

  • вкладка, where, вкладка снова, затем введите первую строку
  • вкладка 3 раза, затем выстраиваются будущие линии с тем, что один

(Примечание: В моем редакторе «вкладка» является «4 пространства», а не символ табуляции)

EDIT: Я думаю, я просто понял, почему это было трудно выстраиваться на моем конце: подсветка синтаксиса ! Мой редактор выделил «где», что сделало его более широким, что сделало правильный отступ неверным. Я действительно подтвердил это, отключив подсветку и, похоже, работает до тех пор, пока линии выравниваются друг с другом.

Это также означает, что таким образом, вероятно, позволяет избежать подобных проблем:

coordinates :: String -> (Float, Float, Float) 
coordinates line = (x,y,z) 
    where 
     (_ : xStr : yStr : zStr : _) = words line 
     x = read $ tail xStr :: Float 
     y = read $ tail yStr :: Float 
     z = read $ tail zStr :: Float 
+3

Почти каждый считает, что правильный подход заключается не в использовании вкладок. – Carl

+0

@Carl, Извините, я должен был уточнить, что мой редактор конвертирует вкладки в 4 пробела. Python - мой основной язык, так что это уже сильно избито. :) –

+6

В этом случае правило прост: каждое объявление внутри блока where должно начинаться в том же столбце. Независимо от того, в каком столбце начинается первое объявление, остальные объявления должны совпадать с ним. – Carl