标签: equational-reasoning

如果返回a = return b那么a = b?

如果那样的return a = return b话你能证明a=b吗?当我使用时=,我的意思是在法律和证据意义上,而不是Eq阶级意义上.

我认识的每一个单子似乎都满足了这一点,我想不出一个有效的monad(Const a不是一个算子和应用,而不是一个monad.)

monads haskell equality semantics equational-reasoning

46
推荐指数
1
解决办法
3678
查看次数

是否可以在不破坏等式推理的情况下使用教会编码?

记住这个计划:

{-# LANGUAGE RankNTypes #-}

import Prelude hiding (sum)

type List h = forall t . (h -> t -> t) -> t -> t

sum_ :: (Num a) => List a -> a
sum_ = \ list -> list (+) 0

toList :: [a] -> List a
toList = \ list cons nil -> foldr cons nil list

sum :: (Num a) => [a] -> a
-- sum = sum_ . toList        -- does not work
sum = \ …
Run Code Online (Sandbox Code Playgroud)

haskell list church-encoding equational-reasoning

14
推荐指数
3
解决办法
275
查看次数

Haskell:Equation Expander 1+(1+(1+(1+(...))))=∞

是否存在Haskell的方程扩展器?

foldr.com这样的东西:1+(1+(1+(1+(…))))=?

我是Haskell的新手我很难理解为什么某些方程比其他方程更优选.我认为如果我能看到方程扩展会有所帮助.

例如,我发现foldrvs foldl起初很难理解,直到我看到它们扩展.

foldr :: (a -> b -> b) -> b -> [a] -> b
foldr k z xs = go xs
             where
               go []     = z
               go (y:ys) = y `k` go ys

foldl :: (a -> b -> a) -> a -> [b] -> a
foldl f z0 xs0 = lgo z0 xs0
             where
                lgo z []     =  z
                lgo z (x:xs) = lgo (f z x) …
Run Code Online (Sandbox Code Playgroud)

haskell expression equation expansion equational-reasoning

13
推荐指数
1
解决办法
1026
查看次数

Idris中的等式证明和界面分辨率问题

我正在尝试为Setoids建模Agda风格的等式推理证明(具有等价关系的类型).我的设置如下:

infix 1 :=:

interface Equality a where
  (:=:)  : a -> a -> Type

interface Equality a => VerifiedEquality a where  
  eqRefl : {x : a} -> x :=: x
  eqSym  : {x, y : a} -> x :=: y -> y :=: x
  eqTran : {x, y, z : a} -> x :=: y -> y :=: z -> x :=: z
Run Code Online (Sandbox Code Playgroud)

使用这样的接口,我可以模拟一些像Syntax.PreorderReasoning伊德里斯库那样的等式推理组合器 .

syntax [expr] "QED" = qed expr 
syntax [from] "={" [prf] "}=" [to] …
Run Code Online (Sandbox Code Playgroud)

dependent-type idris equational-reasoning

6
推荐指数
0
解决办法
205
查看次数

我是否根据foldr使用声音等式推理来定义滤波器?

好吧,这是使用foldr定义过滤函数:

myFilter p xs = foldr step [] xs
    where step x ys | p x       = x : ys
                    | otherwise = ys
Run Code Online (Sandbox Code Playgroud)

例如,假设我有这个功能:

myFilter odd [1,2,3,4]
Run Code Online (Sandbox Code Playgroud)

所以它将是:

foldr step [] [1,2,3,4]
Run Code Online (Sandbox Code Playgroud)

这将是

step 1 (foldr step [] [2,3,4])
Run Code Online (Sandbox Code Playgroud)

这将是

step 1 (step 2 (foldr step [] [3,4]))
Run Code Online (Sandbox Code Playgroud)

这将是

step 1 (step 2 (step 3 (foldr step [] [4])))
Run Code Online (Sandbox Code Playgroud)

这将是

step 1 (step 2 (step 3 (step 4 (foldr step [] []))))
Run Code Online (Sandbox Code Playgroud)

并且foldr step [] [][] …

haskell filter fold equational-reasoning

6
推荐指数
1
解决办法
625
查看次数

Haskell - 如何将map sum(map(x :) xss)转换为map(x +)(map sum xss)

阅读"使用Haskell进行功能思考"我遇到了一个程序计算的一部分,需要将map sum (map (x:) xss)其重写为map (x+) (map sum xss)

直觉我知道它有意义......

如果你有一些你想要求和的列表,但是在求和之前,你还要添加一个元素'x',那么就像获取origninal列表的总和列表并添加x一样对每个人都有价值.

但我想知道如何使用等式推理将一个转换为另一个.我觉得我错过了一条能帮助我理解的法律或规则.

haskell equational-reasoning

6
推荐指数
1
解决办法
180
查看次数

reduce(x + y,xs)和sum(xs)在python中不等效吗?

从功能方程式的角度来看,我希望两者的含义相同:

x = [1, 2, 3]
y = ['a', 'b', 'c']

reduce(lambda x, y: x + y, zip(x, y))  # works

sum(zip(x, y))  # fails
Run Code Online (Sandbox Code Playgroud)

为什么sum在这里失败?

python reduce tuples sum equational-reasoning

3
推荐指数
1
解决办法
108
查看次数

(序列 。) 。翻转 fmap === forM?

(sequence .) . flip fmap一样的forM吗?我在这里问是因为pointfree.io似乎不这么说......

haskell functional-programming pointfree equational-reasoning

1
推荐指数
1
解决办法
67
查看次数