在Data.Typeable有一个函数转换
cast :: forall a b. (Typeable a, Typeable b) => a -> Maybe b
Run Code Online (Sandbox Code Playgroud)
和一个函数 eqT
eqT :: forall a b. (Typeable a, Typeable b) => Maybe (a :~: b)
Run Code Online (Sandbox Code Playgroud)
它们在效果和实现上似乎几乎相同,我想知道 eqT 的描述是否有任何实际意义:提取两种类型相等的见证。
我有一个用 Haskell 编写的 Web 应用程序(在客户端使用 ghcjs,在服务器端使用 ghc),我需要一种方法来收集分布在整个模块中的 CSS 值。目前我使用涉及类和模板 haskell 的技术CssStyle。当模块需要导出某些 CSS 时,它会CssStyle为某种类型创建一个实例(该类型没有任何意义,只是它必须是唯一的。)在顶层,所有实例都是使用模板 haskell 中的函数CssStyle检索的。reifyInstances
这种方法至少有两个缺点:您必须创建无意义的类型来附加实例,并且必须确保所有实例都导入到您扫描并转换为真实 CSS 的位置。谁能想到一种更漂亮的方式来收集嵌入 Haskell 代码中的数据?
===============
Quelklef 请求了一些演示当前解决方案的源代码:
{-# LANGUAGE AllowAmbiguousTypes, OverloadedStrings, MultiParamTypeClasses, TemplateHaskell, LambdaCase, FunctionalDependencies, TypeApplications #-}
import Clay
import Control.Lens hiding ((&))
import Data.Proxy
import Language.Haskell.TH
class CssStyle a where cssStyle :: Css
-- | Collect all the in scope instances of CssStyle and turn them into
-- pairs that can be used to build scss …Run Code Online (Sandbox Code Playgroud) 我从 GHCI 收到一个令人费解的错误,知道这意味着什么吗?一对符号可以正常工作,但单例列表会失败。
$ ghci
> :m +GHC.Types
> :set -XDataKinds -XKindSignatures
GHC.Types> :kind! (["A", "B"] :: [Symbol])
(["A", "B"] :: [Symbol]) :: [Symbol]
= '["A", "B"]
GHC.Types> :kind! (["A"] :: [Symbol])
<interactive>:1:2: error:
* Expected kind `[Symbol]', but `["A"]' has kind `*'
* In the type `(["A"] :: [Symbol])'
<interactive>:1:3: error:
* Expected a type, but `"A"' has kind `Symbol'
* In the type `(["A"] :: [Symbol])'
Run Code Online (Sandbox Code Playgroud) 是否可以编写一个类型函数,使其具有Show之类的约束,然后返回将RHS约束为非 Show实例的类型的函数?
签名将类似于
type family Invert (c :: * -> Constraint) :: * -> Constraint
Run Code Online (Sandbox Code Playgroud) 我已经尽我所能搜索了 ghc 用户手册,但我一直无法找到一种方法让 ghc 在编译时打印每个模块的时间。
今天我有两张地图需要组合:consMaps :: Map k a -> Map k b -> Map k (a, b). 在 Data.Map 中看不到任何内容,我开始实现它,并想出了一些出乎意料的难看的东西:
consMaps :: Map k a -> Map k b -> Map k (a, b)
consMaps ma mb = mapMapMaybe g (Map.unionWith f a' b')
where
a' :: Map k (Maybe (Maybe a, Maybe b))
a' = fmap (\a -> Just (Just a, Nothing)) ma
b' :: Map k (Maybe (Maybe a, Maybe b))
b' = fmap (\b -> Just (Nothing, Just …Run Code Online (Sandbox Code Playgroud) 我有一个Lift适用于 template-haskell 2.14 的实例,但无法使用更高版本进行编译。有人可以解释需要进行哪些更改吗?
{-# LANGUAGE FlexibleInstances, TemplateHaskell #-}
module LiftBS where
import Data.ByteString as B (ByteString, length, unpack)
import Data.ByteString.Unsafe (unsafePackAddressLen)
import Language.Haskell.TH (runIO, litE, stringPrimL)
import Language.Haskell.TH.Lift (Lift(lift))
instance Lift (IO B.ByteString) where
lift bsio = do
bs <- runIO bsio
[|unsafePackAddressLen $(lift (B.length bs)) $(litE (stringPrimL (B.unpack bs))) :: IO ByteString|]
Run Code Online (Sandbox Code Playgroud)