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- 所以我需要一种方法在列表上进行两次传递.我不能只是结合predM并actionM成一个单一的功能.
我有一个数据结构,可以理解为类似于将Data.Map一种类型的键映射到另一种类型的值.我想写一个Control.Lens.At这种类型的实例,但我似乎无法满足所有要求.
由于Struct k v有lookup,insert,update,和delete,我必须做什么做instance At (Struct k v)的工作?
只需阅读精彩的" 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)
我错过了整个棱镜点吗?或者这是一个合法的用例?
干杯!
我想使用字符串文字作为遍历,但我在类型中有点迷失.是否可以创建此实例?
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)
通用量化类型实例的问题.谢谢!
我有点困惑,不知道在哪里寻找下面的"问题"的信息/解释(这本身不是问题,但更多的是我不明白背后有什么问题的情况):
我有一个带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) 我是镜头的新手,我想组成两个"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)
这样做的语法是什么?
是否有更短/更清晰的方式编写以下代码片段:
fromMaybe "" $ fmap (^. fullName) (bi ^. bookerContact)
Run Code Online (Sandbox Code Playgroud)
这bi ^. bookerContact可能会导致Maybe Contact记录,这就是^. fullName需要fmap的原因.在嵌套遍历之后,如果我们最终得到一个Nothing我们用fromMaybe ""它来默认它为空字符串.
我想根据记录中的特定值执行排序.因此我想把镜头传递给一个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的新手.
特定
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吗?
当输入值(未设置字段)为?时,是否有任何方法可以应用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)
我尝试避免使用fmap或maybe/fromMaybe在这种情况下使用,因为我有很多此类操作要做,并且我更喜欢通过利用镜片的简洁/简洁来避免样板。