小编con*_*cid的帖子

在clojure中进行列表处理,需要尾递归

给出一个排序的间隔列表,例如 (def lst (list [7 10] [32 35]))

我需要实现一个向列表添加新间隔的函数.如果新间隔与列表中的任何间隔相邻,则应合并它们:

(= (add-range [1 3] lst)   (list [1 3] [7 10] [32 35]))  ;; prepend left
(= (add-range [1 6] lst)   (list [1 10] [32 35]))        ;; merge left
(= (add-range [11 20] lst) (list [7 20] [32 35]))        ;; merge right
(= (add-range [11 31] lst) (list [7 35]))                ;; merge left and right
Run Code Online (Sandbox Code Playgroud)

这是我的实施:

(defn add-range
  [range range-list]
  (if (empty? range-list)
    (list range)
    (let
      [lo (first range)
       hi (second range) …
Run Code Online (Sandbox Code Playgroud)

algorithm functional-programming tail-recursion clojure

3
推荐指数
1
解决办法
169
查看次数

如何在 Kotlin Arrow FX 中组合 IO 函数和其他效果

在处理之前,我们经常需要一些请求验证。使用箭头 v 0.8,典型的消息处理程序如下所示:

fun addToShoppingCart(request: AddToShoppingCartRequest): IO<Either<ShoppingCardError, ItemAddedEvent>> = fx {
    request
    .pipe (::validateShoppingCard)
    .flatMap { validatedRequest ->
        queryShoppingCart().bind().map { validatedRequest to it }         // fun queryShoppingCart(): IO<Either<DatabaseError, ShoppingCart>>
    }
    .flatMap { (validatedRequest, shoppingCart) ->
        maybeAddToShoppingCart(shoppingCart, validatedRequest)            // fun maybeAddToShoppingCart(...): Either<DomainError, ShoppingCart>
    }
    .flatMap { updatedShoppingCart ->
        storeShoppingCart(updatedShoppingCart).bind()                     // fun storeShoppingCart(ShoppingCart): IO<Either<DatabaseError, Unit>>
        .map {
            computeItemAddedEvent(updatedShoppingCart)
        }
    }
    .mapLeft(::computeShoppingCartError)
}
Run Code Online (Sandbox Code Playgroud)

这似乎是对工作流的方便且富有表现力的定义。我试图在箭头 v 0.10.5 中定义类似的函数:

fun handleDownloadRequest(strUrl: String): IO<Either<BadUrl, MyObject>> = IO.fx {
    parseUrl(strUrl)                                                      // fun(String): Either<BadUrl,Url>
    .map {
        !effect{ downloadObject(it) …
Run Code Online (Sandbox Code Playgroud)

functional-programming kotlin arrow-kt

2
推荐指数
1
解决办法
518
查看次数