小编Dav*_*Fox的帖子

eqT 而不是强制转换的用例是什么?

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

5
推荐指数
0
解决办法
63
查看次数

如何收集分布在 Haskell 代码库中的值

我有一个用 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)

haskell ghc template-haskell

5
推荐指数
1
解决办法
203
查看次数

为什么我无法构造单例符号列表?

我从 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)

haskell

4
推荐指数
1
解决办法
170
查看次数

您可以编写一个类型函数来反转约束吗?

是否可以编写一个类型函数,使其具有Show之类的约束,然后返回将RHS约束为非 Show实例的类型的函数?

签名将类似于

type family Invert (c :: * -> Constraint) :: * -> Constraint
Run Code Online (Sandbox Code Playgroud)

haskell constraint-kinds data-kinds

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

有没有办法查看每个模块的编译时间?

我已经尽我所能搜索了 ghc 用户手册,但我一直无法找到一种方法让 ghc 在编译时打印每个模块的时间。

haskell ghc ghcjs

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

将两张地图组合起来——有那么难看吗?

今天我有两张地图需要组合: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)

haskell

0
推荐指数
1
解决办法
243
查看次数

如何将此 Template Haskell Lift 实例迁移到版本 2.18

我有一个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)

haskell template-haskell

0
推荐指数
1
解决办法
86
查看次数