我在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)
的元组,但是当我尝试编译它时,编译器说行x = read $ tail xStr :: Float
中有一个parse error on input '='
。
有谁知道如何解决它?
感谢您的回答。
我让它工作:
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个空格",而不是制表符)
编辑:我想我刚刚弄清楚为什么很难在我的末端排队:语法突出显示!我的编辑器加粗"where",这使它更宽,这使得正确的缩进看起来不正确。我实际上通过关闭突出显示来确认这一点,只要线条彼此对齐,它似乎就可以工作。
这也意味着这种方式可能会避免类似的问题:
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