我想要创建一个元组,它包含一个箭头和一个描述箭头的字符串.如果我用函数(而不是箭头)这样做,下面的工作就像预期的那样:
funTimes10 = (*10)
describe10 = "times 10"
tuple10 :: (Num b) => ((b -> b), String)
tuple10 = (,) funTimes10 describe10
Run Code Online (Sandbox Code Playgroud)
我可以使用fst和访问函数,并snd获取函数的描述字符串.
但是,如果我用箭头交换功能,如下所示:
aTuple10 :: (Arrow a, Num b) => (a b b, String)
aTuple10 = (,) (arr funTimes10) describe10
Run Code Online (Sandbox Code Playgroud)
fst 仍然有效并返回我的箭头,但是snd.我只收到此错误消息:
Ambiguous type variable `a0' in the constraint:
(Arrow a0) arising from a use of `aTuple10'
Probable fix: add a type signature that fixes these type variable(s)
In the first …Run Code Online (Sandbox Code Playgroud) 我想定义一个monad实例,其中容器M为monad,并且包含的类型a应该是类的成员Show.应该通过类型系统来确保该约束(其a成员Show).
我尝试过这样的尝试,但M遗憾的是不合适:
data M = forall a. Show a => M a
instance Monad M where
return x = M x
Run Code Online (Sandbox Code Playgroud)
所有其他尝试实现这一点,遇到以下问题:由于Monad是一个构造函数类,我没有显式访问a所包含元素的类型,所以我不能限制它.
没有定义新Monad类,有没有人知道这个解决方案?
我假设,不可能在haskell中添加两个类型级自然数.这是真的?
假设自然数的定义如下:
class HNat a
data HZero
instance HNat HZero
data HSucc n
instance (HNat n) => HNat (HSucc n)
Run Code Online (Sandbox Code Playgroud)
以类似于以下的方式定义HAdd是否合适:
class (HNat n1, HNat n2, HNat ne) => HAdd n1 n2 ne | n1 n2 -> ne
instance HAdd HZero HZero HZero
instance (HNat x) => HAdd HZero x x
instance (HNat n1
,HNat x) => HAdd (HSucc n1) x (HAdd n1 (HSucc x) (???))
Run Code Online (Sandbox Code Playgroud) 我在哪里可以找到源代码,隐藏在语言编译指示之后
{-# LANGUAGE Arrows #-}
Run Code Online (Sandbox Code Playgroud)
我已经阅读了相关论文(如帕特森,箭头的新符号),所以理论上发生的是清楚的.现在我想看看,这是如何实际翻译成源代码的.
我的所有搜索仅引用GHC的用户指南或Control.Arrow的来源.我错过了什么吗?
要重新绑定哈斯克尔的PRoC-符号,段落7.3.11"Rebindable语法和隐含的前奏进口"的GHC用户指南的规定,箭头符号使用arr,first...功能,这些功能在范围之内.它还指出类型"必须非常接近地匹配Prelude类型".
鼓励任何想要使用此功能的人询问.那么,这些类型与Prelude类型的匹配程度有多接近?
有没有办法进一步约束现有类型类的上下文?
例如,类型类Functor:
class Functor f where
fmap :: (a -> b) -> f a -> f b
Run Code Online (Sandbox Code Playgroud)
此类定义不强制执行a或b作为其元素Show.此类型类也是我自己包含的类,因此我无法影响类定义.它仍然是可能的,到后来只允许a的,并且b是,那是会员Show?
我想通过更新现有字典来创建新字典。这表现得像假设:
x = {'a': 1}
x.update({'a': 2})
Run Code Online (Sandbox Code Playgroud)
但是为什么下面的结果是 NoneType?
({'a': 1}).update({'a': 2})
Run Code Online (Sandbox Code Playgroud) haskell ×6
arrows ×2
ghc ×2
dictionary ×1
monads ×1
python ×1
python-2.7 ×1
tuples ×1
typeclass ×1