學習新語言時,我的標準技術之一是實現hello world遺傳演算法,該演算法試圖通過與某些輸入字串匹配的遺傳演算法技術來生成字串。
由於我對haskell的經驗不足(我必須比較的最接近的是kotlin),我搜尋了乙個示例**,以便可以將我對基本遺傳演算法的現有理解與該**相匹配,並基於已經在閱讀中的內容對haskell進行一些理解/語言研究。
我遇到了本教程:
設定好環境後,我將其轉錄為原子,我不了解的每個部分我都做了乙個快速的google,如果15分鐘後我不了解語法/語義,我將繼續進行轉錄,以便日後趕上那些特殊的部分。
因此,我了解了大多數**,例如函式應用程式的順序,monad(無論如何我都覺得monad差不多),資料型別,函式型別,currying,型別替換等。但是,語法中有幾分我在閱讀/研究中沒有看到過的/語義學,也不確定它們的作用,但是在上面鏈結到的**示例中,它們會出現很多。我希望有人可以向我解釋:12
3456
7(++)
(:)<$>
<*>
(,)(x !!)
p@(info@())
這是顯示上面幾個示例的特定行:12
3mate :: 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中,您可以定義乙個函式,該函式具有一系列用括號括起來的符號串行作為識別符號,例如(++)或(:),該運算子既可以用作函式,又可以用作(++) x y,也可以用作中綴運算子,例如x ++ y。在幕後,haskell編譯器會將infix運算子轉換為函式呼叫,因此x ++ y與(++) x y完全等效(除了運算子具有不同的優先順序規則的事實)。
好。這是附加函式:(++) :: [a] -> [a] -> [a],它將兩個列表作為輸入,並構造乙個包含相同型別元素的列表,該列表包含第乙個列表的元素,後跟第二個列表的元素。例如:
好。(++) [1, 4, 2, 5] [1, 3, 0, 2] == [1, 4, 2, 5, 1, 3, 0, 2]
這是列表型別[a]的建構函式。它的型別為(:) :: a -> [a] -> [a]。它以乙個元素和乙個元素列表(均為相同型別)為輸入,構造乙個從第乙個元素開始,然後是第二個引數元素的列表。例如:
好。(:) 1 [4, 2, 5] = [1, 4, 2, 5]
您在問題<$>中編寫了**,但您可能已經發現,這意味著在某個位置定義了函式(<$>) :: functor f => (a -> b) -> f a -> f b。
好。functor是型別類。 haskell中有幾種型別是仿函式。最簡單的是列表和maybe。 (<$>)將函式f :: a -> b和函子例項(例如列表[a])作為輸入。然後它將轉換為函子例項[b]。如何完成此操作取決於functor例項的實現方式(maybe的(<$>)與的語義不同)。
好。儘管類推還不完整,但有時可以將functor視為元素的集合(maybe基本上是零個nothing或乙個just x元素的集合)。然後,它將通過函式引導這些元素對映集合中包含的元素,例如:好。1
23(+1) <$> [1, 4, 2, 5] == [2, 5, 3, 6]
(+1) <$> nothing == nothing
(+1) <$> (just 2) == just 3
好。好。好。1
2345
[f1, f2, ..., fm] <*> [x1, x2, ..., xn]
== [f1 x1, f1 x2, ..., f1 xn,
f2 x1, f2 x2, ..., f2 xn,
...,
fm x1, fm x2, ..., fm xn]
因此,例如對於maybe意味著,如果左運算元是nothing,或者右運算元是nothing,或者兩者都是nothing,那麼如果兩個都是just,則結果為nothing s(所以just f <*> just x),那麼我們得到乙個just (f x):好。1
234just f <*> just x == just (f x)
just f <*> nothing == nothing
nothing <*> just x == nothing
nothing <*> nothing == nothing
這是2元組的建構函式:(,) :: a -> b -> (a,b)因此將a和b作為輸入,並構造2元組,其中第一項是第乙個引數,第二項是第二個引數。引數。例如:
好。(,) 4 'a' == (4, 'a')
(x !!)
這是中綴運算子的一部分。您可以使用infix運算子,例如,指定左側或右側部分。在這種情況下,您將構造乙個部分應用的函式。例如:好。1
2([1, 4, 2, 5] !!) == (!!) [1, 4, 2, 5]
(!! 2) == flip (!!) 2
因此,對於後者而言,這意味著我們構造了乙個函式,該函式採用將作為左運算元填充的引數作為輸入。所以:
好。(!! 2) [1, 4, 2, 5] == (!!) [1, 4, 2, 5]
(!!) :: [a] -> int -> a函式將乙個列表和乙個int作為輸入,並返回該索引處的元素(從零開始的索引)。
好。p@(info@())
與上述相反,@不是函式或運算子(實際上它們是相同的),而是關鍵字。
好。它用於模式匹配,以獲取對模式和例如匹配子模式的引用(或獲取對子模式的引用)。
好。例如,假設我們要對2個元組進行模式匹配,並且想要引用整個元組,並且第乙個元素可以使用:
好。somefunction total@(left, _) = ...
因此,如果我們隨後呼叫somefunction (4, 'a'),則意味著total將儲存(4, 'a'),而left將儲存4。
好。好。
這些大多數都是常規功能。
<>不是特殊的語法,只是函式名稱的一部分。
()是常規的圓括號,可以像大多數其他語言一樣對事物進行分組並定義優先順序,重要的一點是,當您要引用運算子(如++)時,必須在圓括號中。
C 中 符號在字串中的
符號是特殊而又實用的c 符號。比如它在string中的應用。1字元 表示,其後的字串是個 逐字字串 verbatim string 這個說法來自c primer 中文版 stanley b.lippman,侯捷 陳碩合譯 2對於逐字字串字面變數 verbatim string literal 我們不...
CSS屬性值定義語法中的符號說名
我們通常看到乙個css語法,總是有很多符號在其中,這些符號是什麼鬼呢,且看下面道來 這些符號可以大致分為2類 分組類與數量類。1 分組類,就是分成一堆一堆啦 符號名稱 描述示例 並置各部分必須出現且按順序出現 solid 與 組合符 各部分必須出現,但可以不按順序 或 組合符 各部分至少出現乙個,可...
譯 Haskell 中隨機數的使用
隨機數 我指的是偽隨機數 是通過顯式或隱式的狀態來生成的。這意味著在 haskell 中,隨機數的使用 通過system.random庫 是伴隨著狀態的傳遞的。大部分需要獲得幫助的人都有命令式程式設計的背景,因此,我會先用命令式的方式,然後再用函式式的方式來教大家在 haskell 中使用隨機數。我...