問題
我有一種感覺,這個問題的原因最終將歸結為我只是在/不了解 Haskell 的新手,所以我會盡量詳細地描述我的描述,使其有點通用。
我使用自定義 XMonad 配置作為我的視窗管理器,在檔案中定義xmonad.hs。
manageHook當某些應用程式需要在某種型別的視窗或某個作業區等中打開時,我使用
XMonad來處理。 https://hackage.haskell.org/package/xmonad-0.17.0/docs/XMonad-管理鉤子.html
manageHook目前,我的 in 中的一堆行xmonad.hs看起來像這樣:
className =? "xxxx" --> doSomething
這是我目前對上述行的理解:
這些運算式涉及 的值className,定義在 中XMonad.Hooks.ManageHook,其Query型別為 ( Query [Char],更具體而言)。
https://hackage.haskell.org/package/xmonad-0.17.0/docs/XMonad-ManageHook.html
Query中定義XMonad.Core。https://hackage.haskell.org/package/xmonad-0.17.0/docs/XMonad-Core.html#t:Query
=?取Query [Char]左邊的 和[Char]右邊的字面量,并回傳一個 type 的值Query Bool;True如果[Char]s 相等,則值將是,False否則(我認為?)
-->Query Bool左邊是 ,右邊是一個動作,如果值為 ,則執行Query Bool動作True。
https://hackage.haskell.org/package/xmonad-0.17.0/docs/XMonad-ManageHook.html
但是,這僅在我知道要應用規則的應用程式的確切類名時才對我有用,但情況并非總是如此。因此,我查看了 xmonad-contrib 以了解我可以定義哪些其他函式。
在XMonad.Hooks.ManageHelpers(https://hackage.haskell.org/package/xmonad-contrib-0.17.0/docs/XMonad-Hooks-ManageHelpers.html)中,有^?,使用如下:
className ^? "xxxx" --> doSomething
據我了解,左邊是 ,右邊是^?文字,并回傳一個值型別; 如果左側是右側,則值將是,否則(我認為?)Query [Char][Char]Query BoolTrue[Char]isPrefixOf[Char]False
我想要創建的是一個類似但相反的新功能。就像是,
"xxxx" ?^ className --> doSomething
where?^取[Char]左邊和Query [Char]右邊的字面量,并回傳 type 的值Query Bool;True如果[Char]左側isPrefixOf是[Char]右側,則該值應該是,False否則。(換句話說,我想定義一個新函式來檢查某個字串文字是否是類名的前綴,而不是檢查類名是否是某個字串文字的前綴。)
最初,我認為這應該很容易,但是查看 的源代碼^?,我意識到我對 Haskell 的理解肯定有一些我從根本上缺少的東西。
這是 的定義^?:
(^?) :: (Eq a, Functor m) => m [a] -> [a] -> m Bool
q ^? x = fmap (`isPrefixOf` x) q
https://hackage.haskell.org/package/xmonad-contrib-0.17.0/docs/src/XMonad.Hooks.ManageHelpers.html#^?
我不明白我將如何撰寫一個與其相反版本的函式。這絕對行不通:
(?^) :: (Eq a, Functor m) => [a] -> m [a] -> m Bool
x ?^ q = fmap (`isPrefixOf` q) q
但我不明白為什么。什么屬性Query是(Query [a]) isPrefixOf ([a])可以接受的,但不是([a]) isPrefixOf (Query [a])?
此外,我該如何定義具有所需行為的函式?我對 Haskell 還是很陌生,所以我不知道從哪里開始。
解決方案
我比我想象的更接近。有關更多詳細資訊,請參閱答案,但解決方案只是修復我呼叫isPrefixOf(oops) 的語法:
x ?^ q = fmap (x `isPrefixOf`) q
uj5u.com熱心網友回復:
您必須將引數切換為isPrefixOf!
x ?^ q = fmap (x `isPrefixOf`) q
其他拼寫是可能的,例如這個不使用中綴形式的版本isPrefixOf:
x ^? q = isPrefixOf x <$> q
((<$>)是 的另一個名稱fmap。)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/462850.html
