小编PyR*_*lez的帖子

适用于将效果顺序颠倒的仿函数

鉴于一个应用程序的仿函数f,我有一个想法,Rev f就像制作一个新的应用程序仿函数,f但效果的顺序相反.这里是:

import Control.Applicative

newtype Rev f a = Rev {unRev :: f a}

instance Functor f => Functor (Rev f) where
  fmap f (Rev fx) = Rev (fmap f fx)

instance Applicative f => Applicative (Rev f) where
  pure x = Rev (pure x)
  (Rev ff) <*> (Rev fx) = Rev (pure (\x f -> f x) <*> fx <*> ff)
Run Code Online (Sandbox Code Playgroud)

我的问题是

  1. 这是一个有效的Applicative实例(它是否遵守Applicative法律)?
  2. 这个结构有名字吗?这个模块隐藏在哪里?

haskell terminology functor applicative

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

除了安全之外,还有强大打字的好处吗?

在Haskell社区中,我们正在慢慢添加依赖类型的功能.依赖类型是一种高级类型功能,类型可以依赖于值.像Agda和Idris这样的语言已经拥有它们.它似乎是一个非常高级的功能,需要一个高级类型系统,直到你意识到python 已经有依赖类型从一开始就具有依赖类型的动态类型版本,可能是也可能不是实际的依赖类型.

对于函数式编程语言中的大多数程序,无论打字有多高级,都有一种方法可以将其作为无类型lambda演算术语重复出现.这是因为打字只会删除程序,而不会启用新程序.

强大的打字赢得了我们的安全.运行时发生的错误类别在运行时不再发生.这种安全性非常好.除了这种安全性之外,强力打字能带给你什么?

除安全性之外,强类型系统还有其他好处吗?

(请注意,我并不是说强打字是没有价值的.安全本身就是一个巨大的好处.我只是想知道是否还有额外的好处.)

haskell types type-systems functional-programming dependent-type

7
推荐指数
3
解决办法
1432
查看次数

如何序列化或保存文件Thunk?

在Haskell中,您可以拥有无​​限列表,因为它不完全计算它们,它使用thunk.我想知道是否有一种方法可以序列化或以其他方式将一个数据保存到文件中.例如,假设您有一个列表[0..].然后,你做一些处理就可以了(我最感兴趣tail(:),但它应该支持这样做filtermap为好.)这里是有点什么,我找的一个例子.

serial::(SerialThunk a)=>a->serThunk
serialized = serial ([0..] :: [Int])
main=writeToFile "foo.txt" serialized
Run Code Online (Sandbox Code Playgroud)

deserial::(SerialThunk a)=>serThunk->a
main=do
    deserialized <- readFromFile "foo.txt" :: IO [Int]
    print $ take 10 deserialized
Run Code Online (Sandbox Code Playgroud)

serialization haskell thunk

6
推荐指数
2
解决办法
304
查看次数

使用'unsafeCoerce'

在Haskell中,有一个名为的函数unsafeCoerce,可以将任何东西变成任何其他类型的东西.这究竟用于什么?比如,为什么我们要以这种"不安全"的方式将事物转化为彼此?

提供unsafeCoerce实际使用方式的示例.Hackage的链接会有所帮助.某些问题中的示例代码不会.

haskell type-conversion type-safety

6
推荐指数
2
解决办法
2251
查看次数

如何只使用您的程序可用的带宽

我正在制作一个程序,将下载一堆不同的项目.我的语言具有廉价的并发性,所以我首先想到我可以一次下载它们.问题是使用你没有的并发性是不好的.如果我尝试一次性下载它们,用户必须等到所有这些才能获得它们之前.

假设您正在下载10个可以以7 mb/s的速度下载的项目,并且您的下载速度为20 mb/s.该程序应该只开始下载前三项,并且只有在旧项目完成且有带宽后才开始下载新项目.另请注意,一般情况下,项目的下载速度不同.

如果我有一些程序化的方法来检查网络饱和度,这将很容易(只需检查它是否在产生新线程之前已经饱和.)

language-agnostic concurrency multithreading network-programming

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

如何“查看”迭代器,同时保留项目?

假设我想查看迭代器的第五个项目,但我想保留所有项目。最好的方法是什么?有模块吗?我可能可以将一个函数组合在一起来创建一个新的迭代器,但我想知道它是否已经完成了?

python iterator python-2.7

6
推荐指数
2
解决办法
3891
查看次数

如何搜索 Haskell 模块(不是包)?

有人知道如何搜索haskell模块吗?例如,如果要键入:

$> hadoodledoodledu Control.Concurrent.Threads
Run Code Online (Sandbox Code Playgroud)

它会返回:

concurrent-extras-0.3
concurrent-extras-0.4
bicameral-jacquard-loom-controller-4.2
Run Code Online (Sandbox Code Playgroud)

如果它可以搜索我当地的阴谋集团回购,那将是最好的,但如果这是不可能的,那也没关系。

haskell package-managers

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

箭头对函数的优势

箭头比haskell中的常规函数​​有什么优势.他们可以做什么功能不能.函数可以使用fmap映射结构.

haskell arrows function

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

如何从浮点数中提取二元分数

现在,浮点数和双精度数,虽然它们可以近似任何类型的数字(虽然可以说是整数,浮点数更精确),但它们在内部表示为二进制小数.例如,十分之一是近似的

0.00011001100110011... (... only goes to computers precision, not infinity)
Run Code Online (Sandbox Code Playgroud)

现在,任何带有限位的二进制数都称为dyadic fraction数学中的表示(与p-adic无关).这意味着你将它表示为分数,其中分母是2的幂.例如,假设我们的计算机接近十分之一为0.00011.对于它的二元分数是3/323/(2^5)接近十分之一.现在我的技术问题.从浮点数中提取二元分数的最简单方法是什么?

不相关注意:如果你想知道我为什么要这样做,那是因为我在Haskell中创建了一个超现实的数字库.二元分数很容易转换为超现实数,这就是为什么方便二进制很容易翻译成二元数的原因(尽管如此,我肯定会遇到有理数的问题.)

language-agnostic binary haskell fractions

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

Juicy Pixels抱怨没有足够的记忆力

$ ghci
GHCi, version 7.10.1: http://www.haskell.org/ghc/  :? for help
Prelude> import Codec.Picture
Prelude Codec.Picture> Right pic <- readImage "smiley.bmp"
<interactive>: out of memory (requested 4296015872 bytes)

smiley.bmp不到300字节.为什么我的内存不足?

memory haskell image ghc ghci

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