- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
This answer演示了一个对其参数求和的多变量函数:
class SumRes r where
sumOf :: Integer -> r
instance SumRes Integer where
sumOf = id
instance (Integral a, SumRes r) => SumRes (a -> r) where
sumOf x = sumOf . (x +) . toInteger
我已经为
Num
的所有成员创建了这个函数的通用版本。 :
class (Num n) => MySumType n r where
mySum :: n -> r
instance (Num n) => MySumType n n where
mySum x = x
instance (Num n, MySumType n r) => MySumType n (n->r) where
mySum x = mySum . (x +)
然而,这只适用于像
mySum (1::Int) (3::Int) (2::Int) :: Int
这样的调用。 .如果没有参数上的类型说明符,我会收到此错误:
No instance for (MySumType n0 Float) arising from a use of `mySum'
Possible fix: add an instance declaration for (MySumType n0 Float)
In the expression: mySum 1.0 :: Float
In an equation for `it': it = mySum 1.0 :: Float
Num a => a
.还有与上述不依赖扩展的等效功能吗?上面使用的是多参数类型类和灵活实例。
最佳答案
到目前为止,我还没有在 haskell 中遇到一个令人信服的多变量函数用例,这无法通过使用列表或类似的数据结构来解决。所以如果你认为你有一个超越新奇的东西,我和他们一起玩的原因,我会很高兴知道它是什么。下面给出了足够多的例子,其中一些是我在发表评论时应该想到的,我已经撤回了我的声明。
{-# language MultiParamTypeClasses #-}
{-# language FlexibleInstances #-}
{-# language TypeFamilies #-}
{-# language IncoherentInstances #-}
class (Num n) => MySumType n r where
mySum :: n -> r
instance (Num n, m~n) => MySumType n m where
mySum x = x
instance (Num n, MySumType n r, n~m) => MySumType n (m->r) where
mySum x = mySum . (x +)
> mySum 1 2 4 5 6 7 :: Int
25
> mySum 1.1 2 4.6 5 6.9 7 :: Double
26.6
> replicate (mySum 1 2 3 4) 6
[6,6,6,6,6,6,6,6,6,6]
Also is there an equivalent function to the one above that does not rely on extensions?
instance (Num n) => MySumType n n where
mySum x = x
class (Num n) => MySumType n r where
mySum :: n -> r
mySum
类型签名为
mySum :: (Num n) => n -> n
.那
n -> n
说的是一个 1 arity 函数,它采用类型
n
, 产生
n
和
n
有一类 Num。
mySum
我必须指定我给它的东西和它产生的东西。
mySum 1 :: Int
mySum (1 :: Int)
mySum (1 :: Int) :: Int
^ ^
| specify output type
specify input type
n -> n
提供了一个实例。但有人可以稍后为
n -> m
添加一个实例如
Int -> Double
如下所示:
instance MySumType Int Double where
mySum x = 2 * fromIntegral x
> mySum (1::Int) :: Int
1
> mySum (1::Int) :: Double
2.0
instance (Num n, m~n) => MySumType n m where
mySum x = x
mySum
这里有类型签名
mySum :: (Num n, m~n) => n -> m
此类型签名适用于所有 1 个采用类型
n
的arity 函数并生成类型
m
在哪里
n
有类 Num 和
m
等于
n
.请注意,这开始匹配所有 1 元函数,
n -> m
, 任意
n
任何
m
然后把它放在上面。
> mySum2 (1::Int)
1
> mySum2 1 :: Int
1
Int -> Double
像以前一样:
instance MySumType Int Double where
mySum x = 2 * fromIntegral x
> mySum2 1 :: Int
1
> mySum2 1 :: Double
1.0
> mySum2 (1 :: Int) :: Double
2.0
mySum2
正在关闭
Int -> Double
实例。这是
IncoherentInstances
的属性我想我会把它留给
another stackoverflow question回答角色
IncoherentInstances
正在玩。
关于haskell - 多元广义和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16307399/
这是我感兴趣的测试: http://www.itl.nist.gov/div898/handbook/eda/section3/eda35h3.htm 如何将这段代码改编成接受数值向量并返回指定要删除
我使用 TensorFlow 1.12 基于 Material 进行语义(图像)分割。使用多项式交叉熵损失函数,这会产生不错的结果,尤其是考虑到我使用的训练数据量稀疏,mIoU 为 0.44: 然而,
AFAIK,在 Hindley-Milner 类型系统中使用的统一可以通过在构造函数位置允许类型变量并在这种情况下放宽 arity 约束来推广以统一更高级的类型: f a ~ T a1 b1 f ~
在阅读 article 时在 Javascript 中实现通用 curry 时,我偶然发现了这段代码。 function curry(fn) { return (...xs) => { i
我想使用 C++14 中引入的广义 lambda 捕获(有关解释,请参阅 Move capture in lambda)。但是,我的代码的其余部分是 C++11 友好的。我想按照以下方式做一些事情 #
我正在尝试实现 this paper 中介绍的广义 Hough 变换在 MATLAB 中。我也试过使用 this document理解算法。我一直在研究如何计算梯度角以找到要在 R 表中使用的 Φ。
假设我们有这样一段代码: std::vector> tasks; 然后我们添加这样的任务: tasks.push_back([]() { // ... } 这行得通。但现在我们要添加该任务:
问题:为什么会打印出以下内容: ChildB___Parent of ChildB ChildB___Parent of ChildB 而不是我认为它应该打印出来的: ChildA___Parent
W3C 推荐 RDF 1.1 概念和抽象语法 defines多么广义 RDF 三元组 是(即,一个非标准三元组,其中每个主语/谓语/宾语都可以是 IRI/bnode/文字)。 关于它的可能用途,它给出
我是一名优秀的程序员,十分优秀!