我有以下代码编译在我的程序中:
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE GADTs #-}
{-# LANGUAGE KindSignatures #-}
{-# LANGUAGE StandaloneDeriving #-}
{-# LANGUAGE TypeFamilies #-}
class (Show (Data a)) => HasData (a :: *) where
type Data a :: *
data Foo :: * -> * where
Foo :: (HasData a) => String -> Data a -> Int -> Foo a -- bunch of args
deriving instance Show (Foo a)
Run Code Online (Sandbox Code Playgroud)
由于Foo构造函数的参数数量可以很多,我想使用记录语法编写代码,但我无法弄清楚如何使用GADT语法(GHC弃用的数据类型上下文,所以我试图避免它们) :
data Foo :: * -> * where
Foo {
getStr …Run Code Online (Sandbox Code Playgroud) 是否有相当于makeLensesGADT?如果我有一个简单的GADT:
data D a b where
D :: (Ord a, Ord b) => !a -> !b -> D a b
Run Code Online (Sandbox Code Playgroud)
有没有办法通过传入构造函数和字段名称列表自动生成镜头?
随意更改标题,我只是没有经验足以知道真正发生了什么.
所以,我是基于这个松散地编写一个程序,并写了这个(因为它在原文中)
type Row a = [a]
type Matrix a = [Row a]
Run Code Online (Sandbox Code Playgroud)
没什么特别的.但是,我发现自己编写了几个类似这样的函数:
Eq a => Row a -> ...
Run Code Online (Sandbox Code Playgroud)
所以我想也许我可以将这个约束写入类型同义词定义中,因为在我看来它不应该那么复杂,对吧?如果编译器可以在函数中使用它,它应该作为类型同义词.这里没有部分申请,也没有任何或某种诡计(对我来说).
所以我尝试了这个:
type Row a = Eq a => [a]
Run Code Online (Sandbox Code Playgroud)
这不起作用,编译器建议启用RankNTypes.该选项使其编译,但函数仍然需要我留下Eq a =>他们的类型声明.顺便说一句,如果我尝试使用type Matrix a = [Row a]类似之前的类型同义词,则会导致错误.
所以我的问题是这样的:
是否可以在其定义中使用类型类型同义词和类型类约束?
这个问题背后的目标是否可以通过其他方式实现?
作为我上一个问题的后续使用makeLenses,类约束和类型同义词,我有一个新的类型错误,我想了解.
类型错误是由type S = (Num n) => State n以下示例中引入类型同义词引起的.
{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE RankNTypes #-}
module Foo where
import Control.Lens
data State a = State { _a :: a
} deriving Show
makeLenses ''State -- Requires TemplateHaskell
-- | Smart constructor enforcing class constraint on record field _a.
mkState :: (Num a) => a -> State a
mkState n = State {_a = n}
doStuff1 :: Num a => State a -> State a …Run Code Online (Sandbox Code Playgroud) 我有一个data类型:
data BuildException a = KillBuild JobID a Stage
| FailBuild JobID a Stage
| CancelBuild JobID a Stage
| StopBuild JobID a Stage
deriving Typeable
Run Code Online (Sandbox Code Playgroud)
其中a必须有一个Foo类的实例.我记得读过(在RWH中,也许)虽然可能在data定义中有类约束,但这是不可取的.那么这样做的正确方法是什么?