可以用作超/下标字母的字符排列似乎完全混乱.其中大多数显然不打算用作sup/subscr.信件,但即使是那些没有提示非常合理的订单.在Unicode 6.0中,现在终于在U + 2095到U + 209C中有下划线字母ht的按字母排序的子集,但这明显相当于块中的剩余空间并且包含不到所有字母的1/3 .
为什么联盟不仅仅为小写字母分配至少一个sup和一个下标字母表的足够空间?
要创建一个接受类型级自然Z,(SZ),(S(SZ))...等的类型类,您可以简单地递归声明实例:
data Z
data S a
class Type a
instance Type Z
instance Type (S a)
Run Code Online (Sandbox Code Playgroud)
是否可以基于类型级谓词创建类型类实例?例如,我希望能够说:
{-# LANGUAGE MultiParamTypeClasses #-}
class Type a b
instance Type x y when (x :+: y == 8)
Run Code Online (Sandbox Code Playgroud)
:+:类型级别添加在哪里,并且==是类型级别相等Data.Type.Equality,因此仅为最多为8的nat对创建实例.
Haskell中的符号是否与此类似?如果没有,这样的事情将如何实现?
编辑:这篇文章的灵感来自关于智能构造函数的Haskell wiki文章,其中InBounds声明了一个类型类以静态验证传递给智能构造函数的幻像类型参数是在某些范围的Nats中,智能构造函数是:
resistor :: InBounds size => size -> Resistor size
resistor _ = Resistor
Run Code Online (Sandbox Code Playgroud)
在我的例子中尝试做类似的事情(在使用leftaroundabout的答案之后)给了我一个错误:
construct :: (Type a b) => a -> b -> MyType a b
construct _ _ …Run Code Online (Sandbox Code Playgroud) 我正在学习一些Haskell,我对这些Monads有些麻烦,我了解它们并知道它们是什么,但在这种特殊情况下我有一些问题.在LYAH学习的时候,我遇到了一个练习,这个练习是关于计算你可以用骑士(来自国际象棋游戏)进行3次动作的位置,我们使用这样的列表monad:
假设,
type KnightPos = (Int,Int)
moveKnight :: KnightPos -> [KnightPos]
moveKnight (c,r) = do
(c',r') <- [(c+2,r-1),(c+2,r+1),(c-2,r-1),(c-2,r+1)
,(c+1,r-2),(c+1,r+2),(c-1,r-2),(c-1,r+2)
]
guard (c' `elem` [1..8] && r' `elem` [1..8])
return (c',r')
Run Code Online (Sandbox Code Playgroud)
这是有效的,如果我给这个函数我的位置,它可以很好地计算未来可能的位置,但现在我正在寻找实现其中的Writer monad所以我可以检索我是如何达到这一点的.所以我做了这个功能,
假设,
type KnightRoute = Writer [KnightPos] KnightPos
moveKnight' :: KnightPos -> [KnightRoute]
moveKnight' (c,r) = do
(c',r') <- [(c+2,r-1),(c+2,r+1),(c-2,r-1),(c-2,r+1)
,(c+1,r-2),(c+1,r+2),(c-1,r-2),(c-1,r+2)
]
guard (c' `elem` [1..8] && r' `elem` [1..8])
return $ toKr (c',r') (c,r)
where toKr pos oldpos = Writer (pos,[oldpos])
Run Code Online (Sandbox Code Playgroud)
它可以工作,如果我给它一个KnightPos但使用monads我无法KnightPos从a中提取a KnightRoute来执行该函数... …
该Cofreecomonad是用于在某种程度上这是错误类型的多态迭代部分功能是有用的.它coiter类似于forM- 在一个错误monad中循环,但它以纯/惰性的方式收集生成的值,你只能在数据结构中看到最后的错误.
例如,Cofree Identity(不允许失败!)是一个无限流,而是Cofree Maybe同构的NonEmpty,并且Cofree (Either e) a基本上是(NonEmpty a, e)(成功迭代值的列表加上最后发生的错误).
现在我想知道在单个错误monad上没有特定模式匹配的情况下,评估结果的最佳方法是什么.由于实例(例如),提取所有值非常容易,但我不确定如何最好地掌握错误.有可能利用它来摆脱价值并留下错误部分:FoldabletoListFoldable
vals'n'err :: (Monad m, Foldable m)
=> Cofree m a -> (NonEmpty a, (m ()))
vals'n'err (a :< q) = case toList q of
[] -> (a:|[], const () <$> q)
l -> first (pure a<>)
$ foldr1 (\(bs,e) (cs,f) -> (bs<>cs, e>>f)) $ …Run Code Online (Sandbox Code Playgroud) 我有一个数据类型定义为
data Foo a = Foo a (a -> a)
Run Code Online (Sandbox Code Playgroud)
该Foo数据构造函数有两个参数值和功能。我需要为此编写 Monad 和 Monad 转换实例。
我正在尝试实现函子实例,
instance Functor Foo where
fmap f (Foo x g) = Foo (f x) (g .(f x))
Run Code Online (Sandbox Code Playgroud)
但我有一个错误Couldn't match type ‘a’ with ‘b’。
这是正确的,因为g只接受类型a并f x会转换a->b。所以接下来我重写为
instance Functor Foo where
fmap f (Foo x g) = Foo (f x) g
Run Code Online (Sandbox Code Playgroud)
我遇到了同样的错误“无法将类型 'a' 与 'b' 匹配”。
我也试过这个
instance Functor Foo where
fmap f (Foo x …Run Code Online (Sandbox Code Playgroud) 我偶尔会想要在开发/测试时延迟纯算法的特定部分,所以我可以通过观察逐个累积的懒惰结果来监视评估(这通常太快而无法在最终使用延迟版).然后我发现自己插入了丑陋的东西,比如sum [1..1000000] `seq` q哪种作品(虽然经常会出现通常的爆炸问题,因为我从来没有想过这个问题),但它更像是试错了.
当我想以这种方式进行一些快速测试并且不能打扰进行适当的分析criterion等时,是否有一个更好,更可控的替代方案仍然同样简单?
我也想避免unsafePerformIO $ threadDelay,但我认为这可能是一个合适的用法.
我确信Emacs的自我记录很棒,但是我似乎无法理解应该如何使用它,因为谷歌搜索我需要的东西通常只需要几秒钟我通常只需要几秒钟. - 不完全令人满意!(离线时根本就不可能,我喜欢在旅途中等...)
这让我想知道:为什么我不能只通过所有本地安装的文档"google",给我一些看起来像我正在搜索的字符串的东西?我想甚至可以grep通过从命令行ping所有文件来实现,但这不可能是这样做的.
apropos 听起来它应该做那样的事情,但事实并非如此......我从来没有发现任何关于那个我还不知道的命令.
我正在实施一个近似计数算法,其中我们:
使用log(log n)位维护计数器X.
将X初始化为0
当物品到达时,增加X的概率(1/2)由1 X
当流结束时,输出2 X - 1,使E [2 X ] = n + 1
我的实现如下:
import System.Random
type Prob = Double
type Tosses = Int
-- * for sake of simplicity we assume 0 <= p <= 1
tos :: Prob -> StdGen -> (Bool,StdGen)
tos p s = (q <= 100*p, s')
where (q,s') = randomR (1,100) s
toses :: Prob -> Tosses -> StdGen -> [(Bool,StdGen)]
toses _ 0 …Run Code Online (Sandbox Code Playgroud) 我刚发现这个
foo = case ((), ()) of
( ()
, () ) -> ()
Run Code Online (Sandbox Code Playgroud)
失败了
/tmp/wtmpf-file11080.hs:3:8:
parse error (possibly incorrect indentation or mismatched brackets)
Run Code Online (Sandbox Code Playgroud)
这可以通过缩进模式的第二行来实现
foo = case ((), ()) of
( ()
, () ) -> ()
Run Code Online (Sandbox Code Playgroud)
但这感觉与我平常的风格不一致,特别是在
bar = case ( some lengthy :: Complicated typed expression
, another also lengthy :: Expression with (Other types) ) of
( Complicated (Pattern match) to (unwrap)
, Expression that's (Again not so short) ) -> the Rest of my Code …Run Code Online (Sandbox Code Playgroud) 当我第一次阅读严肃的批评时-XUndecidableInstances,我已经完全习惯了它,将其视为仅仅删除了令人讨厌的限制Haskell98必须使编译器更容易实现.
事实上,我遇到了大量需要不可判定实例的应用程序,但没有一处它们实际上导致任何与不可判定性相关的问题.卢克的例子存在问题,原因完全不同
class Group g where
(%) :: g -> g -> g
...
instance Num g => Group g where
...
Run Code Online (Sandbox Code Playgroud)
- 好吧,这显然会被任何适当的实例重叠Group,所以不可判断性是我们最不担心的事情:这实际上是不确定的!
但公平地说,我自己保留了"不可判断的实例可能会让编译器挂起".
当我在CodeGolf.SE上阅读这个挑战时获得它,请求代码无限地挂起编译器.嗯,听起来像是不可判断的实例的工作,对吧?
事实证明我无法让他们这样做.以下编译,至少从GHC-7.10开始:
{-# LANGUAGE FlexibleInstances, UndecidableInstances #-}
class C y
instance C y => C y
main = return ()
Run Code Online (Sandbox Code Playgroud)
我甚至可以使用类方法,它们只会在运行时引起循环:
{-# LANGUAGE FlexibleInstances, UndecidableInstances #-}
class C y where y::y
instance C y => C y …Run Code Online (Sandbox Code Playgroud)