您好,我目前正在學習 Haskell,我想知道是否以及如何將 Eq 的函式作為引數傳遞給另一個函式,因為它與 ( )、(-) 和 (*) 一起使用(并且我知道在Haskell 中的一般作業)。我想在我的 bar 函式中使用 Eq 運算子,這取決于我的串列的頭部是小于、等于還是大于 0。但是我在下面的代碼片段中這樣做的方式出現了編譯器錯誤。抱歉,如果我在這里遺漏了一些明顯的東西,我對 Haskell 還很陌生,感謝您的幫助和解釋。
foo :: [x] -> [x]
foo x
| head x < 0 = bar (<) x
| head x == 0 = bar (==) x
| head x > 0 = bar (>) x
bar :: (a -> a -> Bool) -> [x] -> [x]
bar func x = ...
uj5u.com熱心網友回復:
您需要向 中添加一個Ord約束bar,因為您不能在et al 中使用任何型別的值(<),只能使用具有Ord實體的值。您還需要在a整個型別中使用;usingx意味著傳遞的串列型別與Ord約束無關,這會阻止您func在引數的元素上使用x。
bar :: Ord a => (a -> a -> Bool) -> [a] -> [a]
bar func x = ...
由于Eq是 的超類Ord,因此無需Eq明確指定;的實體Ord意味著 的實體Eq。
您需要約束上foo為好,因為你使用<,==以及>在看守,而不是僅僅作為引數bar。為了強調窮舉性,請嘗試使用compare而不是三個單獨的守衛
foo :: Ord a => [a] -> [a]
foo x = let f = case compare (head x) 0 of
LT -> (<)
EQ -> (==)
GT -> (>)
in bar f x
(并考慮需要對 的空串列引數執行什么操作foo。)
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/347698.html
標籤:哈斯克尔
上一篇:如何將bash變數插入到cURL請求的JSON正文中?
下一篇:Haskell中的引數化型別
