小编Pos*_*cat的帖子

标准化函数而不实际在 Haskell 中应用它

我想在不应用它的情况下评估一个函数的正常形式,例如,

\n -> n + sum [1..100]
Run Code Online (Sandbox Code Playgroud)

应该被评估为

\n -> n + 5050
Run Code Online (Sandbox Code Playgroud)

但是没有NFData函数的实例,这是合理的,因为我们无法获得函数的子项。

我想知道是否有可能在一些编译器魔法的帮助下完全规范化一个函数。

evaluation haskell lambda-calculus normalization

6
推荐指数
1
解决办法
195
查看次数

展开存在量化的 GADT

我有一个Value由其类型标记的自定义值类型ValType

data ValType
  = Text
  | Bool

data Value (tag :: ValType) where
  T :: Text -> Value 'Text
  B :: Bool -> Value 'Bool
Run Code Online (Sandbox Code Playgroud)

并且我想定义一个函数来解开存在量化的Value,也就是说它应该具有以下类型签名:

data SomeValue = forall tag. SomeValue (Value tag)

unwrap :: SomeValue -> Maybe (Value tag)
Run Code Online (Sandbox Code Playgroud)

我可以分别定义 unwrap for'Bool'Text,但是如何定义多态unwrap

haskell existential-type gadt dependent-type

6
推荐指数
1
解决办法
141
查看次数

如何实现将两个消费者合二为一的 fork 功能

我正在尝试使用“更快的协程管道”一文中描述的抽象来构建一个流媒体库。我修改了代码,以便它正确处理管道退出(而不是在发生这种情况时抛出错误):

-- | r: return type of the continuation, i: input stream type, o: output stream type,
--   m: underlying monad, a: return type
newtype ContPipe r i o m a = MakePipe {runPipe :: (a -> Result r m i o) -> Result r m i o}
  deriving
    ( Functor,
      Applicative,
      Monad
    )
    via (Cont (Result r m i o))

type Result r m i o = InCont r m i -> OutCont r m o -> m r …
Run Code Online (Sandbox Code Playgroud)

continuations haskell stream deriving derivingvia

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

Haskell 试图理解类型类语法

我是 Haskell 的新手,我正在尝试理解语法。我有数据类型Vec,它实现了Show,FloatingFoldable. 但是语法不同Foldable,为什么?

data Vec a = Vec [a]

instance Show a => Show (Vec a) where
   show (Vec x) = show x

instance Floating a => Floating (Vec a) where
  pi = Vec (repeat pi)
  exp (Vec x) = Vec (map exp x)
  log (Vec x) = Vec (map log x)
  sin (Vec x) = Vec (map sin x)
  cos (Vec x) = Vec (map cos x)

instance …
Run Code Online (Sandbox Code Playgroud)

syntax haskell typeclass

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