我也是初學者,所以也許我的解釋會有所幫助。
點「。」是什麼意思?是什麼意思?例如,在此行中:
filterBy notAllowedChars = not。 (elem
notAllowedChars)。頭。尾
的點做「功能成分」,其中:
(f1 . f2) xs
被定義爲:
f1 (f2 xs)
這也就意味着,Haskell中呈現的右手側的功能點f2,並將xs應用於它:
(f2 xs)
然後哈斯克爾需要的F2的返回值,並將其應用於F1:
f1 retValFromf2
下面是使用功能組成一個簡單的例子:
func1 x = x * 2
func2 x = x + 10
dostuff x = (func1 . func2) x
ghci> dostuff 0
20
又如何過濾器在這裏工作?我沒有在這一行看到任何過濾功能:
filterBy notAllowedChars = not。 (elem
notAllowedChars)。頭。尾部
該函數創建一個過濾器。這個函數是我第一次提供的非點免費功能的替代品:
myFilter :: String -> String -> Bool
myFilter notAllowedChars str =
if head (tail str) `elem` notAllowedChars
then False --if match, reject this string
else True --if no match, include this string in result list
所以我應該有一個名爲點免費功能較好:
createFilter notAllowedChars = not . (`elem` notAllowedChars) . head . tail
你所看到的右邊是一個鏈的函數組合,最右邊的函數tail,首先執行。 tail將一個列表作爲參數並返回一個列表。返回的列表然後應用於頭部。 head將列表作爲參數並返回列表中的單個元素。部分函數:
(`elem` notAllowedChars)
將左邊的單個元素作爲參數,這正是頭部返回值,elem返回Bool。不需要Bool作爲參數,例如真,並返回一個Bool,例如假。請注意,當您將函數與點鏈接在一起時,您必須確保點的右側的函數返回的任何內容都是點左側的函數接受的參數。
- 什麼是實際上「無點」?
我認爲這意味着在函數定義中沒有指定參數。我喜歡將它看作xs是點的列表,並且當xs項沒有出現在函數定義的任何位置時,那麼您已經用點自由樣式編寫了該函數。點不是 '點'。如果點是'一個點',那麼類似這樣的東西:
not . (`elem` notAllowedChars) . head . tail
......很難被稱爲'免費點'。
在Haskell,如果你有這樣定義一個函數:
myfunc xs = head xs
其中XS在右邊出現在平等的雙方簽訂,然後就像一個公式,你可以取消出來生產:
myfunc = head
然後,如果你撥打:
myfunc xs
你得到的結果是相同的與原始的myfunc定義。
現在看這個函數定義:
myfunc xs = tail (head xs)
在這種情況下,如果您從兩側XS你:
myfunc = tail (head)
但尾取一個列表作爲argument--不是一個函數,所以會產生一個錯誤。但是,如果您使用改寫函數組合MYFUNC的右邊:
myfunc xs = (tail . head) xs
...然後再次你可以從兩側取消XS:
myfunc = tail . head
這是再次指向自由的風格。至於你爲什麼會用點自由風格重寫一個函數,我不確定。現在,我認爲這是我可以做的。你會發現,當你學習計算機編程語言時,你會學到一些技巧。有時候,你不確定爲什麼一個技巧在你學習時有用。你只需要接受這樣一個事實:作爲初學者,你並不總是理解爲什麼一個技巧是有用的。直到你變得更有經驗,某種把戲的有用性纔會變得明顯。
在任何情況下,使用免費樣式編寫函數都不會改變函數的工作方式,所以如果您不理解它,請不要擔心。當你更多地學習Haskell時,你可以做一些更高級的事情。
我的目的是comprehens哈斯克爾
你應該認識到:1)在我看來,Haskell是一個非常難學的語言,2)你永遠無法「知道」的計算機編程語言。理解水平是無限的。所以你學習和使用語言越多,你對它的瞭解就越多。這意味着無論您的語言多麼專業,您仍然會遇到難以理解或無法理解的代碼。
@ 7Stud
...不會產生正確的輸出。
正如我上面所寫,Daniel Fischer的代碼與您的代碼一樣正常工作。 你能告訴我你的意思嗎?
我發佈了Daniel Fischer的例子和它產生的輸出。如果您將該輸出與您在op中發佈的輸出進行比較,則它們不匹配。
你應該寫'startsWithU(h:c:_)= c =='u'|| c =='U'代替'startsWithU(c:_)= c =='u'|| c =='U'',然後以'myStringListFilter = filter(not。beginsWithU)結束''或者我沒有達到你的答案的目的。 – zurgl 2013-05-06 12:32:47
@zurgl然後我不會稱之爲'startsWithU',我在問題中被引用爲'map tail',並且沒有仔細觀察所需的輸出。 – 2013-05-06 12:38:47