鉴于一个应用程序的仿函数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)
我的问题是
Applicative
实例(它是否遵守Applicative
法律)?在Haskell社区中,我们正在慢慢添加依赖类型的功能.依赖类型是一种高级类型功能,类型可以依赖于值.像Agda和Idris这样的语言已经拥有它们.它似乎是一个非常高级的功能,需要一个高级类型系统,直到你意识到python 已经有依赖类型从一开始就具有依赖类型的动态类型版本,可能是也可能不是实际的依赖类型.
对于函数式编程语言中的大多数程序,无论打字有多高级,都有一种方法可以将其作为无类型lambda演算术语重复出现.这是因为打字只会删除程序,而不会启用新程序.
强大的打字赢得了我们的安全.运行时发生的错误类别在运行时不再发生.这种安全性非常好.除了这种安全性之外,强力打字能带给你什么?
除安全性之外,强类型系统还有其他好处吗?
(请注意,我并不是说强打字是没有价值的.安全本身就是一个巨大的好处.我只是想知道是否还有额外的好处.)
haskell types type-systems functional-programming dependent-type
在Haskell中,您可以拥有无限列表,因为它不完全计算它们,它使用thunk.我想知道是否有一种方法可以序列化或以其他方式将一个数据保存到文件中.例如,假设您有一个列表[0..]
.然后,你做一些处理就可以了(我最感兴趣tail
和(:)
,但它应该支持这样做filter
或map
为好.)这里是有点什么,我找的一个例子.
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) 在Haskell中,有一个名为的函数unsafeCoerce
,可以将任何东西变成任何其他类型的东西.这究竟用于什么?比如,为什么我们要以这种"不安全"的方式将事物转化为彼此?
提供unsafeCoerce
实际使用方式的示例.Hackage的链接会有所帮助.某些问题中的示例代码不会.
我正在制作一个程序,将下载一堆不同的项目.我的语言具有廉价的并发性,所以我首先想到我可以一次下载它们.问题是使用你没有的并发性是不好的.如果我尝试一次性下载它们,用户必须等到所有这些才能获得它们之前.
假设您正在下载10个可以以7 mb/s的速度下载的项目,并且您的下载速度为20 mb/s.该程序应该只开始下载前三项,并且只有在旧项目完成且有带宽后才开始下载新项目.另请注意,一般情况下,项目的下载速度不同.
如果我有一些程序化的方法来检查网络饱和度,这将很容易(只需检查它是否在产生新线程之前已经饱和.)
language-agnostic concurrency multithreading network-programming
假设我想查看迭代器的第五个项目,但我想保留所有项目。最好的方法是什么?有模块吗?我可能可以将一个函数组合在一起来创建一个新的迭代器,但我想知道它是否已经完成了?
有人知道如何搜索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中的常规函数有什么优势.他们可以做什么功能不能.函数可以使用fmap映射结构.
现在,浮点数和双精度数,虽然它们可以近似任何类型的数字(虽然可以说是整数,浮点数更精确),但它们在内部表示为二进制小数.例如,十分之一是近似的
0.00011001100110011... (... only goes to computers precision, not infinity)
Run Code Online (Sandbox Code Playgroud)
现在,任何带有限位的二进制数都称为dyadic fraction
数学中的表示(与p-adic无关).这意味着你将它表示为分数,其中分母是2的幂.例如,假设我们的计算机接近十分之一为0.00011.对于它的二元分数是3/32
或3/(2^5)
接近十分之一.现在我的技术问题.从浮点数中提取二元分数的最简单方法是什么?
不相关注意:如果你想知道我为什么要这样做,那是因为我在Haskell中创建了一个超现实的数字库.二元分数很容易转换为超现实数,这就是为什么方便二进制很容易翻译成二元数的原因(尽管如此,我肯定会遇到有理数的问题.)
$ 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字节.为什么我的内存不足?
haskell ×8
applicative ×1
arrows ×1
binary ×1
concurrency ×1
fractions ×1
function ×1
functor ×1
ghc ×1
ghci ×1
image ×1
iterator ×1
memory ×1
python ×1
python-2.7 ×1
terminology ×1
thunk ×1
type-safety ×1
type-systems ×1
types ×1