- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在开发一个应用仿函数,其中包含一个用于“查看”执行的幺半群。然而,有时我根本不关心这部分,所以幺半群的选择是无关紧要的,因为它永远不会被消耗。我已经简化了我的内容:
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE ConstraintKinds #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE TypeFamilies #-}
import GHC.Exts
class Render a b where render :: a -> b
instance Render a () where render = const ()
class Merge a where
type Renderer a b :: Constraint
merge :: Renderer a b => a -> b
data Foo = Foo Bool
instance Merge Foo where
type (Renderer Foo) m = (Render Bool m)
merge (Foo b) = render b
Render
用于将各种 a
转换为单个 b
。 Merge
是我的实际仿函数的一个很大的简化,但重点是它包含一个类型系列/约束,我的目的是准确指定 Render
所具有的 >合并
需要。
现在,我可能想“运行”Merge
,但放弃 View ,这类似于:
runFoo :: Merge a => a -> Int
runFoo x = case merge x of () -> 5
但这会失败,因为:
Could not deduce
(Renderer a ())
arising from a use ofmerge
我选择 ()
作为我的幺半群,因为对于所有 a
,我们都有一个 Render a ()
实例。因此,如果有一种方法可以说 Merge a
仅意味着集合 Render
约束,那么这就可以正常工作。当然,Merge a
比这更通用 - 它可以添加任意约束,这解释了编译错误。
是否有办法在不更改 runFoo
签名的情况下实现我想要的目标?
最佳答案
如果您有很多这样的情况,这可能无法扩展,但这是有效的:
class Renderer a () => Merge a where
...
关于haskell - 使用具有 'limited' 约束的约束种类和类型族,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14158074/
在C中,protocol family被提及为第一个参数。 例如: ipv4 的套接字(AF_INET,,) socket(AF_PACKET,,) 用于数据包嗅探 Python 支持三个地址族:AF
根据 vfork() 手册页,如果 vfork() 在调用 _exit 或 exec 之前修改除 pid_t 之外的任何数据,则行为未定义系统调用系列。 由此我了解到,如果vfork()创建的子进程调
我是一名优秀的程序员,十分优秀!