我想在不应用它的情况下评估一个函数的正常形式,例如,
\n -> n + sum [1..100]
Run Code Online (Sandbox Code Playgroud)
应该被评估为
\n -> n + 5050
Run Code Online (Sandbox Code Playgroud)
但是没有NFData函数的实例,这是合理的,因为我们无法获得函数的子项。
我想知道是否有可能在一些编译器魔法的帮助下完全规范化一个函数。
我有一个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?
我正在尝试使用“更快的协程管道”一文中描述的抽象来构建一个流媒体库。我修改了代码,以便它正确处理管道退出(而不是在发生这种情况时抛出错误):
-- | 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) 我是 Haskell 的新手,我正在尝试理解语法。我有数据类型Vec,它实现了Show,Floating和Foldable. 但是语法不同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)