小编sem*_*lon的帖子

为什么乘法只在一侧短路

我是用插科打诨fix和乱搞它后,我遇到了一些怪异的行为来,即0 * undefined*** Exception: Prelude.undefinedundefined * 00.这也意味着,fix (0 *)*** Exception: <<loop>>fix (* 0)0.

在玩它之后,似乎原因是因为在两个方向上使它短路是非常重要的,因为这没有多大意义,没有某种奇怪的并行计算并从第一个非开始底部回来了.

这种事情在其他地方是否可见(反身函数对底值不反身),是否可以安全依赖?也有做出既切实可行的办法(0 *)(* 0)评估,无论传入的值为零.

haskell short-circuiting

47
推荐指数
3
解决办法
2557
查看次数

为什么我的函数的pointfree版本使用更多的内存

我正在研究Project Euler问题并最终得到一个Haskell文件,其中包含一个如下所示的函数:

matches :: (a -> a -> Bool) -> a -> [(a, Int)] -> Int
matches f cs = foldr (\(cs', n) a -> fromBool (f cs cs') * n + a) 0
Run Code Online (Sandbox Code Playgroud)

随着fromBool进口Foreign.Marshal.Utils只是为了快速转换True1False0.

我试图从我的解决方案中获得更多的速度,所以我尝试切换foldrfoldl'(在过程中切换参数),因为我认为foldr在数字上使用没有多大意义.

根据GHC的分析器,从切换foldrfoldl'使我分配的内存超过两倍.

为了好玩,我还决定用函数的pointfree版本替换lambda:

matches :: (a -> a -> Bool) -> a -> [(a, Int)] -> Int
matches f cs = foldr ((+) …
Run Code Online (Sandbox Code Playgroud)

haskell pointfree

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

os.path.join是必要的吗?

目前我os.path.join几乎总是在我的django项目中使用跨操作系统支持; 我目前没有使用它的唯一地方是模板名称和URL.所以在我需要'/path/to/some/file.ext'我使用的路径的情况下os.path.join('path', 'to', 'some', 'file.ext').

然而,我刚刚在Windows上测试我的项目,看看它是否工作正常/是必要的,似乎Windows会很乐意接受'/''\\'(或者'\'在python之外工作时),并且因为所有UNIX系统都使用'/'它似乎没有理由使用'\\',在哪种情况下有必要在os.path.join任何地方使用?

是否存在添加'/'或使用posixpath会导致某些操作系统出现问题的情况(不包括XP或更低版本,因为它们不再受到官方支持)?如果不是,我想我只会使用posixpath或添加一个'/'用于连接变量与其他变量或变量与字符串,而不是分离出字符串路径(所以保留它'/path/to/some/file.ext'),除非有其他原因让我除了破坏之外不这样做.

为了避免这种情况可能以主要意见为基础,我想澄清我的具体问题是,是否使用os.path.join将导致python程序无法在支持的操作系统上按预期工作.

python filepath

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

为什么Tuple没有Monad实例?

我注意到的一件事是Tuple没有Monad实例.

然而,元组有一个Applicative实例:

instance Monoid a => Applicative ((,) a)
Run Code Online (Sandbox Code Playgroud)

这已经极大地限制了我们可以使Monad实例成为现实.

让我们看看我们为加入获得的类型签名:

instance Monoid a => Monad ((,) a)

join :: Monad m => m (m a) -> m a

join :: Monoid a => (a, (a, b)) -> (a, b)
Run Code Online (Sandbox Code Playgroud)

我们还可以看看Monad法则:

join $ f <$> pure x == f x
join $ f <$> (mempty, x) == f x
join (mempty, f x) == f x
join (mempty, (a, b)) == (a, …
Run Code Online (Sandbox Code Playgroud)

monads haskell tuples

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

为什么较高级别的类型在Haskell中如此脆弱

我正在搞乱这个runST功能.哪种类型(forall s. ST s a) -> a,似乎试图以任何方式使用它,没有任何间接直接应用,以非常讨厌的方式打破它.

runST :: (forall s. ST s a) -> a
const :: a -> b -> a
Run Code Online (Sandbox Code Playgroud)

所以通过替换aconstforall s. ST s a你应该得到的类型const runST

const runST :: b -> (forall s. ST s a) -> a
Run Code Online (Sandbox Code Playgroud)

但是相反GHC说它无法a与之相匹配,(forall s. ST s a) -> a但由于a字面上的意思forall a. a是每种类型都满足,我不明白这是什么无效.

事实证明使用\_ -> runST实际上工作得很好,并提供正确的类型.

一旦我拥有constST了正确的类型,我想看看我是否uncurry可以,但不出所料,这也打破了.但它似乎真的不应该,尽管这种情况似乎不像前一个那么明显:

constST …
Run Code Online (Sandbox Code Playgroud)

haskell type-inference higher-rank-types impredicativetypes

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

为什么Haskell包含这么多等效函数

看起来有很多功能可以做同样的事情,尤其是与Monads,Functors和Applicatives有关的功能.

示例(从大多数到最不通用):

fmap == liftA == liftM
(<*>) == ap
liftA[2345] == liftM[2345]
pure == return
(*>) == (>>)
Run Code Online (Sandbox Code Playgroud)

不直接基于FAM类树的示例:

fmap == map
Run Code Online (Sandbox Code Playgroud)

(我认为List,Foldable,Traversable还有很多,但看起来大部分时间都变得更通用了,因为我只看到旧堆栈溢出/留言板问题中旧的,不太通用的类型签名)

我个人觉得这很烦人,因为这意味着如果我需要做x,而某些函数如liftM允许我做x,那么我会使我的函数不那么通用,而且我只会去通过彻底推断类型之间的差异(例如FAM,或者可能是List,Foldable,Traversable组合)来注意那种事情,这对于初学者来说并不友好,因为简单地使用这些类型并不是那么难,关于他们的属性和法律的推理需要更多的心理努力.

我猜这些等价物很多都来自于申请Monad提案.如果这就是他们的原因(并且由于可用于混淆的通用功能较少而缺少其他原因),他们是否会被弃用/删除?由于破坏现有代码,我可以理解等待很长时间才能删除它们,但肯定会弃用是个好主意吗?

haskell

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

如何限制Haskell中的开放世界假设

为了提高我对GHC扩展的了解,我决定尝试用单元来实现数字,而我想要做的一件事就是使用数字文字来表示无单位值.但由于Haskell所做的开放世界假设,结果证明不太实际.我无法工作的最小例子如下:

data Unit u a = Unit a

data NoUnit

instance Num a => Num (Unit NoUnit a) where
    -- (+) (*) (-) abs signum not important
    fromInteger = Unit . fromInteger

type family Multiply a b where
    Multiply NoUnit NoUnit = NoUnit

multiply :: Num a => Unit u1 a -> Unit u2 a -> Unit (Multiply u1 u2) a
multiply (Unit a) (Unit b) = Unit $ a * b
Run Code Online (Sandbox Code Playgroud)

现在,如果我尝试做某些事情,multiply 1 1我希望结果值是明确的.因为获得某种类型的唯一方法Num (Unit u …

haskell typeclass

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

在测试之间自动删除 MEDIA_ROOT

我想知道是否有可能,并且最好不是太难,使用 Django DiscoverRunner 在每次测试之间删除我的媒体目录,包括在最开始和最后一次。我对 Django 1.7 中引入的新属性“test_suite”和“test_runner”特别感兴趣,想知道它们是否会让这个任务变得更容易。

我还想知道如何使测试特定的 MEDIA_ROOT 成为临时文件,目前我有一个名为“media”的常规 MEDIA_ROOT 和一个名为“media_test”的测试 MEDIA_ROOT,并且我在涉及媒体的每个测试类的设置和拆卸中使用 rmtree目录。我指定使用哪个 MEDIA_ROOT 的方式在我的 test.py 设置文件中,目前我只有:

MEDIA_ROOT = normpath(join(DJANGO_ROOT, 'media_test'))
Run Code Online (Sandbox Code Playgroud)

有没有办法可以将 MEDIA_ROOT 设置为名为“media”的临时目录?

python django unit-testing

5
推荐指数
3
解决办法
2130
查看次数

Haskell 中的实际通用长度函数

length在输入上是通用的,因为它接受任何Foldable.

genericLength输出是通用的,因为它输出任何Integral.

是否有一个实际上完全通用的函数,其类型为:

(Integral b, Foldable t) => t a -> b
Run Code Online (Sandbox Code Playgroud)

甚至:

(Num b, Foldable t) => t a -> b
Run Code Online (Sandbox Code Playgroud)

尽管 length 只能产生整数值,但整数也是浮点数,因此产生任何数字都可以。

目前我只是使用:

foldl' (const (+ 1)) 0
Run Code Online (Sandbox Code Playgroud)

我知道可以相当容易地制作一个,但我也知道通常基本函数会以某种方式进行优化,所以我希望有一个现有的函数用于通用计算length. 如果不是,我的后续问题是为什么?具体来说为什么不genericLength接受Foldable

haskell

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

类型族可以做什么,多参数类型类和函数依赖不能

我已经打得四处TypeFamilies,FunctionalDependenciesMultiParamTypeClasses.在我看来好像TypeFamilies没有添加任何具体的功能而不是其他两个.(但反之亦然).但我知道类型家庭非常受欢迎所以我觉得我错过了一些东西:

类型之间的"开放"关系,例如转换函数,这似乎是不可能的TypeFamilies.完成MultiParamTypeClasses:

class Convert a b where
    convert :: a -> b

instance Convert Foo Bar where
    convert = foo2Bar

instance Convert Foo Baz where
    convert = foo2Baz

instance Convert Bar Baz where
    convert = bar2Baz
Run Code Online (Sandbox Code Playgroud)

类型之间的表观关系,例如一种类型安全的伪鸭类型机制,通常用标准类型族来完成.完成MultiParamTypeClassesFunctionalDependencies:

class HasLength a b | a -> b where
    getLength :: a -> b

instance HasLength [a] Int where
    getLength = length

instance HasLength (Set a) Int …
Run Code Online (Sandbox Code Playgroud)

haskell typeclass type-families functional-dependencies

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