给定一组[1,2,3],功率集是唯一的.为什么我们说这是非确定性的?考虑另一个例子
[1,2] >>= \n -> ['a','b'] >>= \ch -> return (n,ch)
Run Code Online (Sandbox Code Playgroud)
为什么这个函数不确定?
如果我认为\ch -> return (n,ch)第二个功能是第一个?
如果第一个功能是
\n -> ['a','b'] >>= \ch -> return (n,ch)
Run Code Online (Sandbox Code Playgroud)
为什么从右到左进行评估.
不应该\n -> (function)吗?
这是什么功能(['a','b'] >>= \ch -> return (n,ch))?
如果它从左到右它不能在\ch不使用第一部分的情况下评估第二部分['a','b'],而第一部分不需要对'n'参数做任何事情.
试图推广(+)到不仅仅是Nums,我写了一个Addable类:
{-# LANGUAGE FlexibleContexts, FlexibleInstances, UndecidableInstances #-}
class Addable a where
(+) :: Addable a => a -> a -> a
instance Addable [a] where
(+) = (++)
instance Num a => Addable a where
(+) = (Prelude.+)
Run Code Online (Sandbox Code Playgroud)
在尝试添加(连接)列表时,GHC 会抱怨重叠实例:
*Test> "abc" + "defghi"
<interactive>:84:7:
Overlapping instances for Addable [Char] arising from a use of `+'
Matching instances:
instance Num a => Addable a -- Defined at Utils.hs:23:10
instance Addable [a] -- Defined at …Run Code Online (Sandbox Code Playgroud) 假设我有一个复杂的GADT,它有许多隐藏的类型参数作为构造函数:
data T where
A :: Num n => n -> T
B :: (Num n, Integral m) => n -> m -> T
C :: Floating a => [a] -> T
-- and so on
Z :: Num n => n -> n -> T
Run Code Online (Sandbox Code Playgroud)
我想让这个数据类型显示而不必手动编写实例.问题是,因为Show不再是超类Num,所以添加一个简单deriving instance Show T对于编译器来说不足以推断它必须Show为所有内部隐藏类型参数添加约束.
对于每个隐藏类型参数,它输出类似的东西
Could not deduce (Show n) arising from a use of 'showsPrec'
from the context Num n
bound by a pattern with …Run Code Online (Sandbox Code Playgroud) 我只是想知道讨厌的goto陈述是否和陈述一样强大comefrom?在我看来,他们的能力可能相等,但我并不完全确定.是否有任何形式证明它们同样强大(或不同等强大)?
对于任何从未听说过的人:comefrom有点颠倒过来goto:
comefrom doom;
WriteLine("I will never stop executing!");
doom:
Run Code Online (Sandbox Code Playgroud) 我想设置一个连续整数步骤,即0,1,2,3,4,.......在我的图表中 valueAxis。我怎样才能做到这一点?
给定mtlmonad堆栈,例如ExceptT String (WriterT String (State s a)),如何评估内部状态monad而无需打开外部monad?
have :: ExceptT String (WriterT String (State s)) a
f :: State s a -> a
want :: ExceptT String (WriterT String Identity) a
Run Code Online (Sandbox Code Playgroud)
我可以通过调用runExceptT后跟runWriterT并重新打包结果来实现这一点,但这似乎是完成此任务的错误方法.
就我所尝试而言,类似fmap或类似的东西将无法工作,因为monad变换器堆栈被视为一个完整的monad.我需要的是一个"拆分"monad变换器堆栈的功能,如下所示:
split :: (MonadTrans s, Monad t) => (s t) a -> s (t a)
Run Code Online (Sandbox Code Playgroud)
要么我没有找到这个功能,要么解决方案完全不同.
haskell ×5
amcharts ×1
charts ×1
comefrom ×1
deriving ×1
gadt ×1
goto ×1
javascript ×1
state-monad ×1
subtyping ×1
type-theory ×1
typeclass ×1