在的公文中,以下两个是函子定律,所有函子都应该遵守。
fmap id == id
fmap (f . g) == fmap f . fmap g
我的直觉告诉我函子应该工作的方式是,它们应该是“保持结构的”,或者换句话说,如果你有一个函数f :: a -> b,它是逆g :: b -> a。
fmap f . fmap g == id
我还没有想出一个fmap的实现,它将遵守前两条法律,并违反第二条,但这是很难证明的。有人能启发我吗?
根据和,类型只能有一个Functor实例(链接中有证据)。但我的理解是,给定类型有可能有多个可能的Monad实例,对吗?但是对于给定的Monad实例,有一个免费的Functor实例
fmap f xs = xs >>= return . f
由此,我得出结论,如果我偶然发现一种类型,在这种类型中,我可以以不同的方式定义多个Monad实例,那么上述导出的fmap函数对于所有这些实例都必须相等,换句话说,如果我有两对函数:
bind_1 :: m a -> (a -> m b) -> m b
unit_1 :: a -> m a
bind_2 :: m a
对于foldr,我们有一个融合定律:如果f是严格的,f a = b,和
f (g x y) = h x (f y) for all x, y,然后是f . foldr g a = foldr h b。
如何才能发现/导出类似的foldr1定律?(显然,它甚至不能采取相同的形式-考虑一下双方在[x]上采取行动的情况。)
我想我已经为提供了一个有趣的“压缩”的实例。
data FreeMonad f a = Free (f (FreeMonad f a))
| Return a
instance Functor f => Functor (FreeMonad f) where
fmap f (Return x) = Return (f x)
fmap f (Free xs) = Free (fmap (fmap f) xs)
instance Applicative f => Applicative (FreeMonad f) where
我在证明命题逻辑中的一些定理。
如果P表示Q和P为真,则Q为真
P → Q
P
-----
Q
会在Haskell中被解释为
modus_ponens :: (p -> q) -> p -> q
modus_ponens pq p = pq p
你可能会发现它的类型是等价的定理和程序是等价的证明。
逻辑分离
data p \/ q = Left p
| Right q
逻辑连接
data p /\ q = Conj p q
当且仅当
type p <-> q = (p -> q) /\ (q -> p)
承认是用来假设一个公理
说:
“类似的论点也表明,任何满足第一定律(fmap id = id)的函数器实例也将自动满足第二定律。实际上,这意味着只需要检查第一定律(通常通过非常简单的归纳),以确保函数器实例是有效的。”
如果是这样的话,为什么我们还要提到第二函子定律呢?
Law 1: fmap id = id
Law 2: fmap (g . h) = (fmap g) . (fmap h)
我想压缩正命题公式的析取范式(DNF)。
我只是暂时假设简单的DNF,而不是否定的文字。在反向过程中,解压可以很容易的定义。对于仅由连接和分离生成的公式,以下重写规则将生成DNF:
A & (B v C) --> (A & B) v (A & C)
(A v B) & C --> (A & C) v (B & C)
下面是解压缩的一个示例:
Example: Decompression
Input:
(p & (q v r) & s & (t v u)) v
w.
Output:
(p &
我想将我的程序从c++转换(或手动编译)到HLA。程序读取输入的数字。然后减去3和10或只有10,确定该值是以零结尾还是以3结尾。连续三个这样的数字赢了比赛!一个不以这些数字结尾的值会输掉游戏。
我不知道如何在HLA中用AND和运算符连接两个条件来执行while循环。
while ((iend != 1) && (iscore < 3))
这是我用C++编写的完整代码,我想把它翻译成HLA:
#include <iostream>
using namespace std;
int main() {
int inum;
int iend = 0;
德米特定律说,对象不能从对象A的对象B中调用方法M。但它也适用于属性吗?例如?
public class B{
public bool IsValid();
}
public class A{
public B B{get;set;}
}
我能做这样的事吗?
var isValid = new A().B.IsValid()
或者我应该这样做:
public class B{
public bool IsValid();
}
public class A{
private B B{get;set;}
public bool IsValid