小编Thr*_*eFx的帖子

产品和副产品在邮政

在阅读Bartosz 为程序员提供的优秀类别理论时,我陷入了第二个练习,即第二个练习,它处理了网络中的产品.鉴于一个poset,

    b   e
  ?   ?   ?
a ? c   f ? h
  ?   ?   ?
    d   g
Run Code Online (Sandbox Code Playgroud)

如何在分类意义上定义产品?什么是两个对象的产品分类?那副产品呢?

product category-theory poset

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

div和quot之间的确切差异

这个问题中div,quot我们提到了两个运营商之间的差异,以及quot运营商比div运营商更有效的事实,而div对我们人类来说更自然.

我的问题是两个运算符的确切实现是什么,并与实现之间的区别有关.此外,我想知道这两者之间的速度差异如何,因为使用Hoogle并浏览源代码并没有帮助我理解.

我想澄清一点,我理解两个运营商之间的一般差异,只对实施或者差异感兴趣.

haskell operators division

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

颠倒荒谬的功能

是否与absurd函数相反Data.Void

如果它存在,它是如何实现的以及它用于什么?

haskell category-theory

6
推荐指数
3
解决办法
499
查看次数

解析器组合器的类型

如果我有一个解析器a : Parser A和一个解析器,b : Parser B那么我可以将它组合成一个解析器a | b : Parser (Either A B).当你开始添加更多替代品并获得类似的类型时,这会有点麻烦Either A (Either B C).我可以想象将之前的类型扁平化为类似的东西Alternative A B C.是否有我可以执行的标准转换,或者我坚持为类型生成一大堆样板文件Alternative A B C ....

parsing haskell types

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

为什么你不能写出"(::) 1 [2]"你在F#中写"(+)1 2"的方式?

将F#中缀运算符放在括号中,它的行为类似于函数,

let foo = (*) 3 2  // foo = 6
let factorial n = [2..n] |> List.fold (*) 1  // n!
Run Code Online (Sandbox Code Playgroud)

但是,这不适用于:: operator(cons运算符),

let ls = (::) 1 [2..5]  // Error: Unexpected symbol '::' in binding.
Run Code Online (Sandbox Code Playgroud)

这是什么原因?

f#

5
推荐指数
2
解决办法
188
查看次数

直接生成powerset的特定子集?

Haskell的表现力使我们能够轻松定义一个powerset函数:

import Control.Monad (filterM)

powerset :: [a] -> [[a]]
powerset = filterM (const [True, False])
Run Code Online (Sandbox Code Playgroud)

为了能够执行我的任务,所述powerset按特定函数排序是至关重要的,所以我的实现类似于:

import Data.List (sortBy)
import Data.Ord (comparing)

powersetBy :: Ord b => ([a] -> b) -> [a] -> [[a]]
powersetBy f = sortBy (comparing f) . powerset
Run Code Online (Sandbox Code Playgroud)

现在我的问题是,是否有一种方法只能在给定特定点和点的情况下生成powerset 的子集,其中和.例如,我的参数是一个整数列表(),它们按总和排序.现在我想提取只能在给定范围内的子集,可以说对.实现这一目标的一种方法是使powerset仅包括我的范围,但在处理更大的子集时这似乎(并且)无效:startendf(start) < f(end)|start| < |end|[1,2,3,4,5]37filter

badFunction :: Ord b => b -> b -> ([a] -> b) -> [a] -> [[a]]
badFunction start end f = filter …
Run Code Online (Sandbox Code Playgroud)

combinations haskell set

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

固定点上的Monoidal折叠

给定具有固定点的任意数据结构,我们可以构造一个幺半代数而无需手动指定所有情况吗?

假设我们得到如下数据类型Expr.使用recursion-schemes图书馆,我们可以得出一个基地函子ExprF,可自动也有Functor,FoldableTraversable实例.

{-# LANGUAGE DeriveFunctor, DeriveFoldable, DeriveTraversable #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE TemplateHaskell #-}

import Data.Semigroup (Sum(..))
import Data.Functor.Foldable
import Data.Functor.Foldable.TH

import Prelude hiding (fail)

data Expr = Var String
          | Const Int
          | Add [Expr]
          | Mult [Expr]
          deriving Show

$(makeBaseFunctor ''Expr)

expr :: Fix ExprF
expr = ana project $ Add [Const 1, Const 2, Mult [Const 3, Const 4], Var "hello"]
Run Code Online (Sandbox Code Playgroud)

现在,假设我们想要计算叶子的数量expr …

haskell monoids recursion-schemes

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

最有效的方法来获得任意大数字的数字计数

获取数字数字的最有效方法是什么?

让我们从一个例子开始:

想象一下Fibonacci序列.现在让我们说我们想要知道哪个Fibonacci数是第一个有1000个数字(以10为基数表示).最多308位数(1476th Fibonacci数)我们可以通过使用轻松完成此操作logBase 10 <number>.如果该数字大于第1476个Fibonacci数,logBase则返回Infinity并且计算将失败.问题是308距离1000有点远,这是我们最初的目标.

一种可能的解决方案是将我们想要知道的数字转换为字符串的数字,并使用它的长度来确定数字计数.这对我的目的来说效率有点低,因为用10000来尝试这个时间需要花费很多时间.

其他问题中显示的最有效的方法是硬编码我真正不想做的所有可能的情况,特别是因为所提出的解决方案中所需的位数超过10.

那么回到我的问题:确定基数为10的数字计数的最佳(最有效)方法是什么?是真的将它转换为字符串并使用它的长度还是有任何"黑客"技巧,如0x5f3759df

注意:我很欣赏任何语言的解决方案,即使它被标记为"haskell".

haskell numbers digit

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

为什么Functor不公开fmap的默认实现?

Functor类类型定义中:

class Functor f where
    fmap :: (a -> b) -> f a -> f b
Run Code Online (Sandbox Code Playgroud)

为什么没有fmap默认实现?像这样的东西:

class Functor f where
    fmap :: (a -> b) -> f a -> f b
    fmap fn (f a) = (f $ (fn) a)
Run Code Online (Sandbox Code Playgroud)

当我编写实例时Functor,我手动为每个实例编写相同的代码.有没有办法指定默认实现?

haskell functor

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

不使用序列实现mapM

我目前正在尝试解决20个中级Haskell练习练习,而且我试图在没有使用的情况下尝试实现mapM(moppy在练习中)sequence.

我只能[m b]通过简单的应用来制作,fmap但我不知道如何继续:

moppy :: [a] -> (a -> m b) -> m [b]
moppy la f = furry' f la -- how do I transform [m b] to m [b] without sequence
Run Code Online (Sandbox Code Playgroud)

有人能给我一个提示,看哪个方向?

monads haskell

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