gpt4 book ai didi

haskell - 这种请求-响应类型是否有标准抽象?

转载 作者:行者123 更新时间:2023-12-03 23:41:35 24 4
gpt4 key购买 nike

我有以下类型:

data S req rsp = Done rsp | Next req (rsp -> S req rsp)

这个想法是将其用作网络通信的纯表示,即:
... Next GetUser $ \uid -> Next (Login uid) $ \success -> Done success

然后将由一些不纯函数 eval 进行评估.

现在,这是什么(如果有的话?)据我所知,它不是单子(monad),也不是箭头。它似乎是流/管道/自动机/fsm和延续单子(monad)之间的东西。这让我觉得这种类型的东西可能有更好的表示,但是什么?

最佳答案

它是 Free Monad .
这个想法是你有一个指令的描述,你可以有多个解释器,比如你的 eval功能。 Free Monad 对这个任务的模式进行了抽象。详情我推荐this great post .

使您的类型适应 Free我们可以做到以下几点:

{-# LANGUAGE DeriveFunctor #-}

import Control.Monad.Free

data Instruction req rsp next =
Respond rsp |
Interact req (rsp -> next)
deriving (Functor)

type S req rsp =
Free (Instruction req rsp)

respond :: rsp -> S req rsp ()
respond rsp =
liftF (Respond rsp)

interact :: req -> S req rsp rsp
interact req =
liftF (Interact req id)

现在,感谢 Free , S req rsp是一个单子(monad),这意味着你现在可以编写你的 respondinteract使用 Monad 的函数API。

还有更多。 respondinteract可以使用带有以下额外代码的 Template Haskell 生成函数:
{-# LANGUAGE TemplateHaskell #-}

import Control.Monad.Free.TH

makeFree ''Instruction

关于haskell - 这种请求-响应类型是否有标准抽象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40203535/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com