Я получил это работает:
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
код компилируется нормально (ну, не совсем, так как 'x' имеет тип' Float' и ваш тип подписи указывает, что он должен иметь тип ' Floating a => a'), но нет ошибки синтаксического анализа, на этой строке или любом другом. – user2407038
Я уверен, что это проблема с отступом, но можете ли вы привести пример допустимого значения 'linea'? –
Спасибо, это была, по сути, проблема с отступом. Я новичок в Haskell. – Adrian