小编wer*_*ter的帖子

GHC不会选择唯一可用的实例

我正在尝试在Haskell中编写CSS DSL,并使语法尽可能接近CSS.一个困难是某些术语既可以作为财产也可以作为价值出现.例如flex:你可以在CSS中使用"display:flex"和"flex:1".

我让自己激发了Lucid API,它基于函数参数覆盖函数,以生成属性或DOM节点(有时也共享名称,例如<style><div style="...">).

无论如何,我遇到了一个问题,即GHC未能检查代码(Ambiguous类型变量),在一个应该选择两个可用类型类实例之一的地方.只有一个实例适合(实际上,在类型错误GHC打印"这些潜在的实例存在:"然后它只列出一个).我很困惑,考虑到单个实例的选择,GHC拒绝使用它.当然,如果我添加显式类型注释,那么代码将编译.下面的完整示例(对于Writer,只有依赖项是mtl).

{-# LANGUAGE FlexibleInstances #-}
module Style where

import Control.Monad.Writer.Lazy


type StyleM = Writer [(String, String)]
newtype Style = Style { runStyle :: StyleM () }


class Term a where
    term :: String -> a

instance Term String where
    term = id

instance Term (String -> StyleM ()) where
    term property value = tell [(property, value)]


display :: String -> StyleM ()
display = term "display"

flex :: Term a => …
Run Code Online (Sandbox Code Playgroud)

haskell typeclass ghc

6
推荐指数
2
解决办法
299
查看次数

如何使用自定义haddock可执行文件生成堆栈文档?

我正在为Haddock制作一个新的主题,并希望在一些真实的项目中尝试它.如何配置堆栈以使用我的haddock可执行文件?我没有在stack.yaml中看到任何配置选项.我也尝试将新的haddock可执行文件放入我的PATH,但这没有用.

haskell haddock haskell-stack

6
推荐指数
0
解决办法
186
查看次数

如何强制where子句中的绑定为CAF?

我有一些绑定,我想保持一个函数的私有(所以,没有在顶级模块命名空间中声明),但是计算成本很高,所以我更喜欢它们是CAF.是否有一个pragma或其他一些技巧可以用来迫使GHC为这些绑定分配CAF?

示例代码:

header :: HeaderProps -> Element
header = div_ [style_ headerStyle] [str_ "Here be headerz"]
  where
    -- Creating the 'headerStyle' is expensive! Do it only once
    -- regardless of how many times the 'header' function is used.
    headerStyle = mkStyle $ do
        display flex
        flexDirection column
        padding (px 20) (px 40)
Run Code Online (Sandbox Code Playgroud)

如果那是不可能的,我会看到一些选项,但每个选项都有其自身的缺点:

  1. 将每个函数移动到自己的模块中,这样我就可以将昂贵的绑定移动到顶级模块命名空间,而不必担心访问它们的其他函数.由于我希望有许多这样的功能,模块的数量会爆炸(大型项目中有数百个).并且我不喜欢每个模块宗教中唯一的一个函数,就像它在node.js社区中传播一样.
  2. 将绑定移动到顶级模块名称空间,并为每个名称提供足够唯一的名称以避免冲突,并使其非常清楚,这些是私有的(例如headerStyle- > header__headerStyle).
  3. 使用TemplateHaskell卸载昂贵的计算编译时.

haskell

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

标签 统计

haskell ×3

ghc ×1

haddock ×1

haskell-stack ×1

typeclass ×1