Tag: Haskell

模仿Haskell的列表模式

阅读之前,请注意,无需具备Haskell或函数式编程的先验知识。 文章 最近,我一直在试验Haskell,尤其喜欢一种功能-列表模式匹配中的(x:xs),其中x是当前元素,即所谓的“ head”,而xs是其余元素列表,即所谓的“尾巴”。 下面是一个示例,其中包含提到的功能,即列表的长度方法: 话虽如此,我开始怀疑用另一种语言实现此功能是否有用。 下一个代码段是尝试在Swift中“模仿”它: 如您所见,这两种方法都是“ Array”类型的扩展。 我称之为第一个(因为无法给出更好的名称)递归,它返回一个由可选元素(称为x)组成的元组,而数组的其余部分称为xs。 X是可选的,因为在某个时候可能还没有实际的元素。 它的身体是不言自明的:self.first是当前的头,self.dropFirst将返回“尾巴”。 但是,dropFirst的返回类型是ArraySlice而不是Array,因此是map方法。 现在,在某种程度上模仿了Haskell的功能,可以实现它的长度。 一般情况是返回1加上当前“迭代”末尾使用长度的结果,请参见示例2,l。 9.上面两行是列表为空并返回0或head元素不存在的情况,这意味着它等于null并仅返回1。 尽管它的实现方式不如Haskell中的原始方法那么优雅,但它可以在某种程度上对我产生吸引力。 我自己,我真的没有看到像Swift这样的语言进行递归的优势,我的一些认识Swift的朋友也没有。 但是,这可能是一种吸引人的设计模式。

Swift中的功能组合

数学中一个非常有趣的概念是函数合成 ,正如名称所暗示的那样,它允许将两个函数合成。 用数学符号表示,可以写如下的方程式 f-> x:x * 3 g-> x:x + 4 h-> x:f。 G h(5)= 27 总结起来,这意味着放在组合函数中的x值将首先在右边服务该函数,并且其结果将用作左边函数的参数。 Haskell是一种可以充分利用后者的编程语言,下面是一个示例: 所以, 将返回13。 但是我们如何在Swift中实现函数组合呢? 让我们使用游乐场看看! 优先级组的唯一用途是使我们后面的“°”中缀运算符保持关联。 …函数的签名非常有趣,让我们来看一下。 我们有三种通用类型-T,U和V。我们的第一个参数f1接受一个函数,该函数接受U并返回V。但是,第二个参数f2接受一个函数,该函数接受T并返回U。我们的返回类型为一个函数本身,它采用T,因此为f2的自变量,并返回V,因此返回类型为1。这是正确的,考虑到如何在顶部解释函数的组成。 由于我们的返回类型将是一个函数,因此我们必须能够插入一个值,因此,我们是否必须使用闭包,这将说明返回后的花括号。 将要输入的值称为x,然后将我们的函数放在一起:f1取f2,x取x。 我们定义了以下两个函数,以便可以测试组成,最后一个表达式表明它有效。 我们完成了,看起来不是很优雅吗?

F#中的流上的收缩函数

编程并不总是要按时完成任务,进行冲刺,构建应用程序或修正错误,有时您想蜿蜒而行,享受旅程。 F#是一种出色的语言,可用于退步,分区,让世界的烦恼消散,并获得一些乐趣。 我知道是异端,但是是的,编程可能很有趣。 当Apple将Swift定位为儿童的理想学习语言时,它总是让我感到震惊,表面上是因为它要使用多少乐趣。 实际上,我想不出一种有趣的语言,即以陈述为导向的思想的陈旧过时的融合,甚至在刚出厂时就已经过期了。 无论如何,足够的咆哮和狂欢,让我们做些曲折的🙂 定点玩法 在介绍收缩函数之前,让我们简要介绍一下fix函数。 本文很好地解释了Haskell中的函数,其基本思想是fix使我们能够将函数的主体编写为普通函数,而fix负责递归。 修复(1 🙂 :是Haskell中的惰性cons运算符,因此上述函数将生成一个无限的1序列。 由于fix负责递归机制,因此我们将重点放在编写简单函数体的内容上。 当然,如果我们尝试在f#中编写相同的函数,那么在f#中并不是那么简单。 让rec fix f = f(fix f) 设ht = h :: t 让一个=修复(缺点1) 我们迎来了一个 进程由于StackOverflowException而终止。 当然这并不令人震惊,我们都知道f#在减少函数应用程序本身之前使用急切的求值方法将函数参数评估为标准形式。 Haskell做相反的事情,它将函数评估为弱头范式,而未对参数进行评估。 之前的大量技术鬼话可能并没有多大意义,因此请阅读这篇文章,以获得关于评估策略的更容易理解的文章。 底线是我们需要在我们的f#定义中引入thunk(函数的占位符)。 你觉得幸运吗,Thunk? 我们可以像这样滚动自己的重击,或者可以利用如下的内置Lazy类型 惰性定点和无限流| F#代码段 使用惰性定点组合器定义的无限流的示例。 www.fssnip.net 修订的懒惰定义使用懒惰的构造函数将我们每个函数应用程序包装在一起。 let fix : (Lazy -> ‘T) -> Lazy = fun f -> let rec x = […]

iOS和模板Haskell

与Android和Haskell模板类似,我们需要将GHCSlave(远程iserv)实例包装到iOS应用程序中。 在iOS设备上提供Template Haskell评估上下文。 从昨天开始使用适用于iOS的Haskell Cross Compiler,我们现在将构建GHCSlave iOS应用程序。 警告:由于x86_64链接器代码中的错误,Template Haskell尚不能与iOS Simulator一起使用。 链接器代码固定后,我已用斜体标记了模拟器的命令,并将删除此警告。 在此之前,模板Haskell只能在设备上/在设备上使用。 先决条件 同样,我们需要构建iserv-proxy和iserv库。 如果不清楚, 请参考 Raspberry Pi的 说明。 签出自定义ghc分支后: git clone-递归git://git.haskell.org/ghc.git 光盘ghc git remote add zw3rk https://github.com/zw3rk/ghc.git git fetch zw3rk git checkout -b zw3rk / my-ghc git reset –hard zw3rk/my-ghc git子模块更新–init –recursive 我们需要使用我们的常规编译器来构建iserv-proxy : ghc / iserv $ cabal install -flibrary -fproxy 以及带有交叉编译器的iserv库: ghc […]

适用于iOS的Haskell交叉编译器

到目前为止,我们已经为Raspberry Pi构建了Haskell Cross Compiler,并且为Android构建了Haskell Cross Compiler。 为了解决这个问题,我们还将为iOS构建一个交叉编译器。 WWDC发出信号通知32位设备的末尾,最后32位设备是iPad(第四代)和iPhone 5 / iPhone 5C,我们将只构建64位交叉编译器。 请注意,Apple 在其他地方 将 arm64 称为 aarch64 。 这是很不幸的。 SDK和LLVM Apple随Xcode一起提供了iOS SDK。 因此,需要AppStore的Xcode的最新副本。 由于Apple不随Xcode一起交付opt和llc ,而且GHC当前要求llvm4提供opt和llc ,因此我们也需要从LLVM发布下载网站获取副本。 工具链包装 Apple为xcrun实用程序提供了针对我们所需工具的自动设置工具链。 但是,我们仍然需要提供目标前缀别名,以实现更好的自动工具互操作。 最初的设置工作归功于ghc-ios-scripts,我们将使用经过稍微修改的版本: #!/ bin / bash 名称= $ {0 ## * /} cmd = $ {name ## *-} target = $ {name%-*} 案例$ name *-阴谋) fcommon […]