标签: haskell-lens

我可以使用monadic动作从Control.Lens过滤折叠吗?

Control.Lens.Fold包含filtered,我可以用来在应用一些monadic动作之前过滤列表.似乎没有相应的filteredM- 但有没有办法达到这个效果?

要清楚,说我有

xs      :: [ MyType ]
predM   :: MyType -> MyMonad Bool
actionM :: MyType -> MyMonad ()
Run Code Online (Sandbox Code Playgroud)

我怎么能申请actionM到的每个元素xs这对于predM返回True

一个重要的约束是我想predM在第一次调用之前对所有调用进行排序actionM- 所以我需要一种方法在列表上进行两次传递.我不能只是结合predMactionM成一个单一的功能.

haskell lenses haskell-lens

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

如何编写Control.Lens.AT的实例

我有一个数据结构,可以理解为类似于将Data.Map一种类型的键映射到另一种类型的值.我想写一个Control.Lens.At这种类型的实例,但我似乎无法满足所有要求.

由于Struct k vlookup,insert,update,和delete,我必须做什么做instance At (Struct k v)的工作?

haskell lenses haskell-lens

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

Aeson Prism带有"免费"参考

只需阅读精彩的" Lens/Aeson Traversals/Prisms"文章并拥有真实世界的应用程序.鉴于以下匿名JSON结构,我如何棱析出集合而不是特定值?

{"Locations" : [ {"id" : "2o8434", "averageReview": ["5", "1"]},{"id" : "2o8435", "averageReview": ["4", "1"]},{"id" : "2o8436", "averageReview": ["3", "1"]},{"id" : "2o8437", "averageReview": ["2", "1"]},{"id" : "2o8438", "averageReview": ["1", "1"]}]}
Run Code Online (Sandbox Code Playgroud)

我有:

?> locations ^? key "Locations" . nth 0 . key "averageReview" . nth 0
Just (String "5")
Run Code Online (Sandbox Code Playgroud)

我想要的是:

?> locations ^? key "Locations" . * . key "averageReview" . nth 0
["5", "4", "3", "2", "1"]
Run Code Online (Sandbox Code Playgroud)

我错过了整个棱镜点吗?或者这是一个合法的用例?

干杯!

haskell aeson haskell-lens

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

是否可以使Traversal成为IsString的实例

我想使用字符串文字作为遍历,但我在类型中有点迷失.是否可以创建此实例?

import Control.Lens
import Data.Aeson
import Data.Aeson.Lens
import Data.String
import Data.Default

{- Having:
key'  :: AsValue t => Text -> Traversal' t (Maybe Value)
_JSON :: (ToJSON a, FromJSON a) => Traversal' t a
-}

instance (AsValue t, FromJSON v, ToJSON v, Default v) => IsString (Traversal' t v) where
  fromString k = key' (fromString k) . non (toJSON def) . _JSON
Run Code Online (Sandbox Code Playgroud)

在State monad中实现这样的目标:

"some-key" .= (3 :: Int)
Run Code Online (Sandbox Code Playgroud)

通用量化类型实例的问题.谢谢!

haskell types aeson haskell-lens

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

Haskell镜头:让Traversal绑定'

我有点困惑,不知道在哪里寻找下面的"问题"的信息/解释(这本身不是问题,但更多的是我不明白背后有什么问题的情况):

我有一个带StateT的monad变换器堆栈.在我的函数中的某个时刻,我想将我的一小部分状态绑定到局部变量中,所以我可以引用它而不是写出我感兴趣的状态块的整个路径.这就是我的意思意思:

{-# LANGUAGE ScopedTypeVariables #-}

...

someFunction :: MyMonad ()
someFunction = do
  ...
  let x :: Traversal' MyState MyDataT = myState.clients.ix clientIdx.someData.ix dataIdx
  ...
Run Code Online (Sandbox Code Playgroud)

现在这不编译:

Couldn't match type ‘(MyDataT -> f0 MyDataT)
                     -> MyState -> f0 MyState’
              with ‘forall (f :: * -> *).
                    Control.Applicative.Applicative f =>
                    (MyDataT -> f MyDataT) -> MyState -> f MyState’
Run Code Online (Sandbox Code Playgroud)

但是如果我将这个数据块的引用移动到一个函数中,那么一切都可以编译好:

someFunction :: MyMonad ()
someFunction = do
  ...
  let x = clientData clientIdx dataIdx
  ...

  where clientData :: Int …
Run Code Online (Sandbox Code Playgroud)

haskell traversal haskell-lens

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

组合定位镜头的语法是什么?

我是镜头的新手,我想组成两个"setter"操作,等同于state0到new_state2的转换:

  let new_state1 = field1 %~ (const newVal1) $ state0
  let new_state2 = field2 %~ (const newVal2) $ new_state1
Run Code Online (Sandbox Code Playgroud)

这样做的语法是什么?

setter haskell lenses haskell-lens

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

使用Maybe遍历嵌套记录的更短方法

是否有更短/更清晰的方式编写以下代码片段:

fromMaybe "" $ fmap (^. fullName) (bi ^. bookerContact)
Run Code Online (Sandbox Code Playgroud)

bi ^. bookerContact可能会导致Maybe Contact记录,这就是^. fullName需要fmap的原因.在嵌套遍历之后,如果我们最终得到一个Nothing我们用fromMaybe ""它来默认它为空字符串.

haskell lenses haskell-lens

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

将镜头传递给一个功能

我想根据记录中的特定值执行排序.因此我想把镜头传递给一个lensSort功能,但我一直无法使它工作.

理想情况下,我可以做这样的事情

lensSort :: HasLens a => Lens' a b -> a -> a -> -> Ordering
lensSort lens x y | x ^. lens > y ^. lens = GT
                    | x ^. lens < y ^. lens = LT
                    | otherwise = GT
Run Code Online (Sandbox Code Playgroud)

并且可以用类似的东西来称呼它

data Rectangle = Rectangle { _height :: Int, _width :: Int }
makeLenses'' Rectangle

let foo = [Rectangle 1 2, Rectangle 2 1]
sortBy (lensSort height) foo
Run Code Online (Sandbox Code Playgroud)

我没有让这个工作,并担心我可能会完全咆哮错误的树,我仍然是Haskell的新手.

haskell haskell-lens

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

将镜头组合成元组的镜头

特定

data Person = Person { _name :: String }
makeClassy ''Person
Run Code Online (Sandbox Code Playgroud)

这创造了一个

name :: Lens' Person String
Run Code Online (Sandbox Code Playgroud)

我可以定义以下name在元组内使用的镜头.

sndPerson :: Lens' (a, Person) (a, String)
sndPerson = lens
    (\(a, p) -> (a, p ^. name)) 
    (\(_, p) (a, n) -> (a, p & name .~ n))
Run Code Online (Sandbox Code Playgroud)

上面有一个更好/规范的方法sndPerson吗?

haskell haskell-lens

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

仅当输入值为“ Just x”时才套用镜头“ setter”吗?

输入值设置字段)为?时,是否有任何方法可以应用Control-Lens-Setter.html#g:4中提到的组合器/设置器?Just x

例如,考虑(~+)组合器,如果我具有以下条件:

let target = (1, 2)
    input1 = Just 10
    input2 = Nothing
Run Code Online (Sandbox Code Playgroud)

我想要一个执行以下操作的设置器:

(11, 2) == target & (_1 . someSetter) +~ input1 
                  & (_2 . someSetter) +~ input2
Run Code Online (Sandbox Code Playgroud)

我尝试避免使用fmapmaybe/fromMaybe在这种情况下使用,因为我有很多此类操作要做,并且我更喜欢通过利用镜片的简洁/简洁来避免样板。

haskell lenses haskell-lens

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

标签 统计

haskell ×10

haskell-lens ×10

lenses ×5

aeson ×2

setter ×1

traversal ×1

types ×1