Haskell:在函数内的do块之后使用多个let并返回一个值

Mur*_*lm. 1 haskell functional-programming let

如标题所示,我想在do块之后返回一个值。

示例:编写一个将变量插入到数组中给定位置的函数:

insertAt :: a -> Int -> [a] -> [a]
insertAt x n xs = do
            let before = take n xs
            let after  = drop n xs
            let merged = before ++ [x] ++ after
            in  merged
Run Code Online (Sandbox Code Playgroud)

例如:

insertAt'x'3“ Aleander” =>“ Alexander”

无论如何,当使用单个let调用时,可以使用in关键字返回一个值,但是在示例中多次调用let会得到错误:

错误:解析输入“ in”中的错误

我知道我可以在一个let用法中完成全部操作,但是我想知道如何处理多个let调用:)

谢谢您的帮助!

Wil*_*sem 8

请不要使用do表达式。do表达式是带有绑定的表达式的语法。是的,列表是的实例Monad,但是您使用的方式不正确。

您可以let在以下代码块中定义:

insertAt :: a -> Int -> [a] -> [a]
insertAt x n xs =
    let before = take n xs
        after = drop n xs
        merged = before ++ [x] ++ after
    in  merged
Run Code Online (Sandbox Code Playgroud)

但是使用起来可能更优雅splitAt :: Int -> [a] -> ([a], [a]),例如:

insertAt :: a -> Int -> [a] -> [a]
insertAt x n xs = let (hs,ts) = splitAt n xs in hs ++ x : ts
Run Code Online (Sandbox Code Playgroud)