【发布时间】:2018-02-06 22:11:55
【问题描述】:
我正在学习 Haskell。
在学习一门新语言时,我的标准技术之一是实现一个 Hello World 遗传算法,该算法尝试通过匹配某个输入字符串的遗传算法技术生成一个字符串。
由于我对 Haskell 缺乏经验(我要比较的最接近的东西是 Kotlin),我搜索了一个示例代码,以便我可以将我对基本遗传算法的现有理解与代码相匹配,并根据我已经对 Haskell 的一些理解进行直觉正在阅读/研究该语言。
我偶然发现了这个教程:https://www.arcadianvisions.com/blog/2011/haskell-genetic-algorithm-hello-world.html
我在设置环境后将其转录为 atom稍后再讨论这些特定部分。
所以,我理解了大部分代码,例如函数应用的顺序、monad(无论如何我认为我已经差不多有了 monad)、数据类型、函数类型、柯里化、类型替换等。但是,有几个我在阅读/研究中没有看到的一些语法/语义,并且不确定它们的作用,但它们在我上面链接的代码示例中出现了很多。我希望有人可以向我解释:
(++)
(:)
<$>
<*>
(,)
(x !!)
p@(info@())
我假设() 和<> 是一些特殊的语法,它们里面的东西是语义的?当我在 atom 中将鼠标悬停在它们上时(我正在使用 atom-haskell-ghc),我可以看到类型 Functor f => Applicative (f :: * -> *) where <*> :: f (a -> b) -> f a -> f b 看起来像 monad,但我并不真正理解消费端的奇怪语法/语义.我是否应该将这些视为另一个函数(带有奇怪的中缀别名?)。
这是一个特定的行,展示了上面的几个示例:
mate :: RandomGen g => Gene -> Gene -> Rand g Gene
mate gene1 gene2 = (++) <$> flip take gene1 <*> flip drop gene2 <$> pivot
where pivot = getRandomR (0, length gene1 - 1)
【问题讨论】:
-
Haskell wiki 有一些概述,wiki.haskell.org/Keywords 其他是您可以使用 hoogle 查找的函数:haskell.org/hoogle/?hoogle=%28%2B%2B%29
-
是的,我有 hoogle 设置,所以我可以通过终端进行查找。我去看看,谢谢。
-
嗯,帽子 hoogle 链接说 (++) 执行列表连接。我以为 ++ 这样做了……括号是多余的吗?等一下,我会发布一些我不明白的实际代码。
-
好吧,没有 Haskell 官方语言法庭”会让你因为使用一种语法而不是另一种语法而入狱 :)。我认为通常是通过定义一个类似 @ 的运算符987654330@(这里的
?可以是任何符号序列),它更多地暗示了中缀的使用,但是由于您本身并没有将所有参数添加到函数中,例如,您可以将它们用作其他函数的一部分,比如zipWith (++) [[1], [4]], [[2], [5]]。
标签: haskell