相关疑难解决方法(0)

用约束类型写GADT记录

我有以下代码编译在我的程序中:

{-# 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)

haskell record type-constraints gadt

14
推荐指数
1
解决办法
2837
查看次数

GADT的makeLenses(Haskell)

是否有相当于makeLensesGADT?如果我有一个简单的GADT:

data D a b where
  D :: (Ord a, Ord b) => !a -> !b -> D a b
Run Code Online (Sandbox Code Playgroud)

有没有办法通过传入构造函数和字段名称列表自动生成镜头?

haskell gadt lenses

7
推荐指数
1
解决办法
485
查看次数

具有类型类约束的类型同义词是否可行?

随意更改标题,我只是没有经验足以知道真正发生了什么.

所以,我是基于这个松散地编写一个程序,并写了这个(因为它在原文中)

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]类似之前的类型同义词,则会导致错误.

所以我的问题是这样的:

  • 是否可以在其定义中使用类型类型同义词和类型类约束?

    • 如果没有,为什么?
  • 这个问题背后的目标是否可以通过其他方式实现?

haskell typeclass

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

类型同义词导致类型错误

作为我上一个问题的后续使用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)

haskell

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

数据记录的类约束

我有一个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定义中有类约束,但这是不可取的.那么这样做的正确方法是什么?

haskell types

2
推荐指数
1
解决办法
502
查看次数

标签 统计

haskell ×5

gadt ×2

lenses ×1

record ×1

type-constraints ×1

typeclass ×1

types ×1