相关疑难解决方法(0)

让重命名函数中断代码

在将代码迭代到正确的版本时,我遇到了以下好奇心:

{-# LANGUAGE RankNTypes #-}

module Foo where

import Data.Vector.Generic.Mutable as M
import Control.Monad.Primitive

-- an in-place vector function with dimension
data DimFun v m r = 
  DimFun Int (v (PrimState m) r -> m ())

eval :: (PrimMonad m, MVector v r) => DimFun v m r -> v (PrimState m) r -> m ()
eval = error ""

iterateFunc :: (PrimMonad m, MVector v r)
            => (forall v' . (MVector v' r) => DimFun v' m r) -> …
Run Code Online (Sandbox Code Playgroud)

haskell ghc

15
推荐指数
2
解决办法
459
查看次数

为什么在枚举所有情况时通配符匹配不起作用?

考虑这个代码:

{-# LANGUAGE GADTs #-}

data P t where
 PA :: P Int
 PB :: P Double
 PC :: P Char

isA PA = True
isA _ = False
Run Code Online (Sandbox Code Playgroud)

它编译并运行良好。现在考虑这个代码:

{-# LANGUAGE GADTs #-}

data P t where
 PA :: P Int
 PB :: P Double
 PC :: P Char

isA PA = True
isA PB = False
isA PC = False
Run Code Online (Sandbox Code Playgroud)

它无法编译:

Main.hs:8:10: error:
    • Couldn't match expected type ‘p’ with actual type ‘Bool’
        ‘p’ is untouchable
          inside the …
Run Code Online (Sandbox Code Playgroud)

haskell type-inference pattern-matching gadt

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

通用实例定义时触发单态限制

考虑以下:

{-# LANGUAGE TypeFamilies, FlexibleContexts, GADTs, MultiParamTypeClasses #-}

type family F r

class (Functor t) => T t r where
  fromScalar :: r -> t r

data Foo t r where
  Foo :: t (F r) -> Foo t r
  Scalar :: r -> Foo t r

toF :: r -> F r
toF = undefined

convert :: (T t (F r))
  => Foo t r -> Foo t r
convert (Scalar c) = 
  let fromScalar' = fromScalar
  in Foo …
Run Code Online (Sandbox Code Playgroud)

haskell ghc

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

标签 统计

haskell ×3

ghc ×2

gadt ×1

pattern-matching ×1

type-inference ×1