lenses

    3热度

    1回答

    我想创建一些代码,可以采取任何递归语法数据类型和该数据类型的任何表达式,并产生一个相同类型的所有子表达式的列表,建立起来的,种类就像一个scan这个类型的递归。 我已经为伴随的玩具计算器语法类型EExp编写了两个手动示例。第一个示例使用Lens库中的棱镜和透镜,仅适用于一个eg1示例表达式,而第二个函数仅使用手动代码,但可用于任何EExp表达式。 理想情况下,我可以使用模板哈希克尔或其他东西来自动

    2热度

    1回答

    较短的方式是否有写下面的代码片段的短/清洁方式: fromMaybe "" $ fmap (^. fullName) (bi ^. bookerContact) 这里bi ^. bookerContact可能导致Maybe Contact纪录,这也是为什么要fmapped ^. fullName需求。在嵌套遍历之后,如果我们以Nothing结尾,我们使用fromMaybe ""将其默认为空字符

    2热度

    1回答

    修改哈斯克尔嵌套记录说我有一个嵌套的结构如下: data Bar = Bar { _id :: Integer, _bars :: [Bar] } data Foo = Foo { _bars :: [Bar] } 而且我有一个Foo与各种id个一堆Bars: foo = Foo [Bar 1 [Bar 2], Bar 3 [Bar 4, Bar 5]] 怎么办,也许使用镜头,我修改fo

    0热度

    1回答

    TL展开;博士:是否有可能使用任何lens家族的抽象的包装/解开任意newtype(即提供了一种用于这样的抽象的实例)? 我会通过一个基于真实故事的简单示例来激发我的问题。假设我定义以下newtype: newtype FreeMonoid a = FreeMonoid { asMap :: Map a Int } 它是用来表示形式方面: a0 <> a1 <> ... <> an-1 我

    6热度

    2回答

    import Control.Lens import Control.Lens.TH data Foo = Foo { _bar, _baz :: Int } makeLenses ''Foo 现在,如果我要修改这两个int字段,我可以做 barbaz :: Setter' Foo Int barbaz = sets $ \foo f -> foo & bar %

    0热度

    1回答

    我在缠绕这条管道时遇到了麻烦。给定一组学生,我想映射它们,根据现有属性的值(grade)添加一个新属性(icon)。我通过忽略现在的映射部分并将重点放在每个单独的问题上,将问题分解成更小的部分。 条件 为此,我决定用R.cond getter和setter 我使用的镜头为这个 全码 const student = { "studentName" : "Nancy", "grad

    2热度

    1回答

    我有一些嵌套的记录(简化到相关字段)。 data GameS = GameS { _game_data_gs :: GameData } data GameData = GameData { _players_gd :: PlayerMap } data PlayerMap = PlayerMap { _p_map :: Map PlayerName Player } data Playe

    0热度

    1回答

    我可能正在考虑这种错误的方式,但是我在Scala中遇到了在使用构造函数扩展某些类的类时使用镜头的问题。 class A(c: Config) extends B(c) { val x: String = doSomeProcessing(c, y) // y comes from B } 我想创建一个Lens变异这一类,但我有麻烦这样做。这是我想什么能够做到: val l = Le

    -2热度

    1回答

    我开始使用镜头,直到现在我一直无法在我正在编写的代码库的具体部分中使用它们。我的目标是通过在现有的节点中添加新节点来更新玫瑰树结构,例如Data.Tree中的玫瑰树结构。要做到这一点我认为这将是有意义的标识具有唯一ID的每个节点,因此它看起来就像是: type MyTree = Tree Id type Path = [Id] addToTree :: MyTree -> MyTree ->

    2热度

    1回答

    我有一个状态卤素成分,包括像这样的镜头: import Optic.Core (Lens', lens) type State = { userName :: String , password :: String , formError :: String } _userName :: Lens' State String _userName =