這是代碼:
import qualified View.TreeWidget as TreeWidget
main :: IO ()
main = do
print $ bla "sdfsd"
bla someString = case someString of
TreeWidget.name -> True
"sdfsd" -> False
_ -> True
TreeWidget.name是在這樣的檔案中定義的函式TreeWidget.hs:
name :: String
name = "tree_list_name"
這是錯誤:
src/View/Main.hs:8:3: error:
Qualified name in binding position: TreeWidget.name
|
8 | TreeWidget.name -> True
| ^^^^^^^^^^^^^^^
- 為什么會這樣?
- 可以做什么?
謝謝。
uj5u.com熱心網友回復:
當您看到小寫模式時,這意味著一個匹配所有內容的變數。_如果變數未在右側使用,您也可以使用模式通配符 ( )。
name -> True
模式變數用作活頁夾,您不能"tree_list_name" -> ..用
name -> ..
name :: String
name = "tree_list_name"
這也意味著您不能從其他模塊參考模式變數,這就是TreeWidget.name正在做的事情。
解決方案是使用模式同義詞。在View.TreeWidget模塊中寫類似
{-# Language PatternSynonyms #-}
module View.TreeWidget (pattern Name) where
pattern Name :: String
pattern Name = "tree_list_name"
現在您可以Name同時用作運算式和模式。所以你現在可以寫
import qualified View.TreeWidget as TreeWidget
bla :: String -> Bool
bla TreeWidget.Name = True
bla "sdfsd" = False
bla _ = True
uj5u.com熱心網友回復:
正如 Iceland_jack 解釋的那樣,您不能將值name用作模式。您可以用作模式的本質上是建構式和文字,其中建構式通常是出現在data宣告中的大寫事物,例如和Just型別。該擴展允許為已宣告的型別定義自定義建構式。NothingMaybePatternSynonyms
someString == TreeWidget.name然而,盡管我通常更喜歡模式而不是相等檢查,但這似乎是一種只檢查是否并采取相應措施更有意義的情況。這可以通過警衛輕松完成:
bla someString
| someString==TreeWidget.name = True
bla "sdfsd" = False
bla _ = True
當然,由于結果又是一個布林值,你也可以只使用邏輯運算子:
bla someString = someString==TreeWidget.name || someString/="sdfsd"
如果你喜歡無點,也可以這樣寫
bla = or . ([(==TreeWidget.name), (/="sdfsd")]<*>) . pure
...但更有效的是只為someString.
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/532470.html
標籤:哈斯克尔
