我在下面得到一个解析错误,我不知道为什么。谢谢你的帮助!
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
答案 0 :(得分:8)
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
必须有自己的in
(do
表示法和列表推导除外)。
因此您可以使用
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(或更大,在第二种情况下,忽略其他元素。)
这里很难猜出你真正需要什么。