我一直在嘗試實作一個函式,它將作為引數給出的函式串列應用于給定變數。我一直在遇到各種型別錯誤,包括無限型別和型別不匹配。下面是使用遞回的草稿,我認為它接近作業,但繼續運行以鍵入不匹配。我很難陷入這個問題的沼澤,不知道如何取得進展。
applyList :: [a -> b] -> a -> [b]
applyList [] variable = variable
applyList (f:fs) variable = applyList fs $(\f variable -> f variable)
這是我使用 foldl 的另一個草案解決方案,也沒有成功。
applyList :: [a -> a] -> a -> a
applyList fs variable = foldl (\variable f -> f variable) variable fs
示例用法:
applyList [] "foo" ==> "foo"
applyList [] 1 ==> 1
applyList [( "bar")] "foo" ==> "foobar"
applyList [reverse, tail, ( "bar")] "foo" ==> "raboo"
applyList [(3*), (2^), ( 1)] 0 ==> 6
applyList [( 1), (2^), (3*)] 0 ==> 2
uj5u.com熱心網友回復:
看起來您正在嘗試撰寫兩個不同的函式。讓我們分別看看它們。如果你想要這個簽名,
applyList :: [a -> b] -> a -> [b]
然后您想將每個函式應用于輸入并獲取結果串列。你不需要一個 lambda。您可以簡單地f
在遞回的每一步應用到變數。
applyList :: [a -> b] -> a -> [b]
applyList [] _ = []
applyList (f:fs) variable = f variable : applyList fs variable
現在,Haskell 提供了許多用于處理串列和資料結構的高級運算子,因此這種顯式遞回并不像您想象的那么頻繁。特別是,你applyList
真的只是map
功能。
applyList :: [a -> b] -> a -> [b]
applyList fs a = map (\f -> f a) fs
并且\f -> f a
可以短接到操作員部分
applyList :: [a -> b] -> a -> [b]
applyList fs a = map ($ a) fs
現在是第二個。如果這是你的目標
applyList :: [a -> a] -> a -> a
那么你想要棄牌是對的。根據您的示例輸入和輸出,您似乎希望首先應用最右邊的函式,因此我們可以使用foldr
applyList :: [a -> a] -> a -> a
applyList fs a = foldr (\f a -> f a) a fs
再次,\f a -> f a
只是一種可愛的寫作方式($)
applyList :: [a -> a] -> a -> a
applyList fs a = foldr ($) a fs
如果您現在還不清楚,請不要擔心。如果您對此更滿意,請堅持使用您的遞回定義。這種更高層次的思考伴隨著在 Haskell 中的時間和經驗,如果你繼續做你正在做的事情,我保證你會到達那里。
uj5u.com熱心網友回復:
請記住,串列的第一個元素應該是最外層的函式,這意味著您不需要向后執行任何操作或使用foldl
. 明確地寫出來,它會是這樣的:
applyList [] variable = variable
applyList (f:fs) variable = f (applyList fs variable)
并與foldr
:
applyList = foldr (.) id
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/493310.html
上一篇:創建haskel套接字客戶端