我是用插科打诨fix和乱搞它后,我遇到了一些怪异的行为来,即0 * undefined是*** Exception: Prelude.undefined和undefined * 0是0.这也意味着,fix (0 *)是*** Exception: <<loop>>和fix (* 0)是0.
在玩它之后,似乎原因是因为在两个方向上使它短路是非常重要的,因为这没有多大意义,没有某种奇怪的并行计算并从第一个非开始底部回来了.
这种事情在其他地方是否可见(反身函数对底值不反身),是否可以安全依赖?也有做出既切实可行的办法(0 *)和(* 0)评估,无论传入的值为零.
我正在研究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只是为了快速转换True到1和False到0.
我试图从我的解决方案中获得更多的速度,所以我尝试切换foldr到foldl'(在过程中切换参数),因为我认为foldr在数字上使用没有多大意义.
根据GHC的分析器,从切换foldr到foldl'使我分配的内存超过两倍.
为了好玩,我还决定用函数的pointfree版本替换lambda:
matches :: (a -> a -> Bool) -> a -> [(a, Int)] -> Int
matches f cs = foldr ((+) …Run Code Online (Sandbox Code Playgroud) 目前我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程序无法在支持的操作系统上按预期工作.
我注意到的一件事是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) 我正在搞乱这个runST功能.哪种类型(forall s. ST s a) -> a,似乎试图以任何方式使用它,没有任何间接直接应用,以非常讨厌的方式打破它.
runST :: (forall s. ST s a) -> a
const :: a -> b -> a
Run Code Online (Sandbox Code Playgroud)
所以通过替换a在const为forall 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) 看起来有很多功能可以做同样的事情,尤其是与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提案.如果这就是他们的原因(并且由于可用于混淆的通用功能较少而缺少其他原因),他们是否会被弃用/删除?由于破坏现有代码,我可以理解等待很长时间才能删除它们,但肯定会弃用是个好主意吗?
为了提高我对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 …
我想知道是否有可能,并且最好不是太难,使用 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”的临时目录?
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?
我已经打得四处TypeFamilies,FunctionalDependencies和MultiParamTypeClasses.在我看来好像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)
类型之间的表观关系,例如一种类型安全的伪鸭类型机制,通常用标准类型族来完成.完成MultiParamTypeClasses并FunctionalDependencies:
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)