解析错误:Haskell

时间:2018-05-09 16:34:57

标签: haskell

我在下面得到一个解析错误,我不知道为什么。谢谢你的帮助!

   createObject :: [a] -> object a 
   createObject lst =
      let x = lst !! 0
      let y = lst !! 1
      let z = lst !! 2
      in object(x,y,z)

   test.hs:28:5: error: parse error on input `let'
   |
   28 |     let y = lst !! 1

2 个答案:

答案 0 :(得分:8)

Haskell中的

let-in表达式只使用一个let

createObject :: [a] -> object a 
createObject lst =
  let x = lst !! 0
      y = lst !! 1
      z = lst !! 2
  in object(x,y,z)

do块中,您确实使用了多个let绑定,但我们没有使用in表达式:

trivialExample :: [a] -> IO (Object a)
trivialExample lst = do 
  let x = lst !! 0 
  let y = lst !! 1 
  let z = lst !! 2
  return $ object (x,y,z)

答案 1 :(得分:1)

每个let必须有自己的indo表示法和列表推导除外)。

因此您可以使用

createObject lst =
      let x = lst !! 0
      in let y = lst !! 1
      in let z = lst !! 2
      in object(x,y,z)

但这不是惯用的,因为单个let可能涉及一组定义。实际上,@ jkeuhlen在let的惯用语中表现出来。

但是,您应该避免使用!!,这是缓慢和部分的,并且尽可能优先使用模式匹配。

createObject :: [a] -> object a 
createObject [x,y,z] = object (x,y,z)
createObject _       = error "createObject: input list must have length 3"

createObject :: [a] -> object a 
createObject (x:y:z:_) = object (x,y,z)
createObject _         = error "createObject: input list must have length >= 3"

请注意,上面仍然是代码气味:输入类型[a]看起来不对,因为它似乎允许任何列表长度,当它实际上仅在长度3(或更大,在第二种情况下,忽略其他元素。)

这里很难猜出你真正需要什么。