gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 16:12:18 25 4
gpt4 key购买 nike

我想使用字符串文字作为遍历,但我对类型有点迷失。是否可以创建这个实例?

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

要在 State monad 中实现类似的功能:

"some-key" .= (3 :: Int)

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

最佳答案

我无法编译你的代码,但这并不重要。我假设你有一个类型为

的函数
fromStringTraversal :: (AsValue t, FromJSON v, ToJSON v, Default v) 
=> String -> Traversal' t v
fromStringTraversal = undefined

然后,要编写实例,只需将 Traversal' 的定义内联到实例头中即可。这是有效的,因为实例中的任何类型变量都是隐式普遍量化的。

{-# LANGUAGE RankNTypes, FlexibleInstances, GADTs #-}

instance (a ~ a', b ~ b', AsValue b, Default a, FromJSON a, ToJSON a, Applicative f)
=> IsString ((a -> f a') -> b -> f b') where
fromString = fromStringTraversal

a ~ a', b ~ b' 约束可以从上下文移动到实例头,但这种方式可以提供更好的类型推断。然后

{-# LANGUAGE OverloadedStrings, NoMonomorphismRestriction #-}

-- Infered type:
-- test :: (AsValue s, MonadState s m) => m ()
test = "some-key" .= (3 :: Int)

关于haskell - 是否可以使 Traversal 成为 IsString 的实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28509424/

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