我想更改所有文字。
data Expressions a = ListExpression String[Expressions a]
| BinaryExpression String (Expressions a) (Expressions a)
| UnaryExpression String(Expressions a)
| Variables Variable
| Literals a
deriving Eq
現在我想全部Literals更改為b,如果c等于b. 所以例子:
changeData 20 30 (Literals 100) = (Literals 100)
changeData 20 30 (Literals 20) = (Literals 30)
運算式本身不應更改。
changeData :: (Eq a) => a -> a -> Expressions a -> Expressions a
changeData a b c
我不明白如何訪問它。我想是這樣的:
fmap (Literals b == Literals a) (\x -> if x == True = a else b)
我認為:每個運算式的文字 b == 文字 a。如果為真,則更改為 a,否則更改為 b。
但是就像我寫下來的那樣,它不起作用,我無法弄清楚我的錯誤。
我從根本上誤解了什么嗎?
uj5u.com熱心網友回復:
首先,您的Functor實體正在組成資料建構式,而不是使用實際定義的建構式。
instance Functor Expressions where
fmap f (Literals a) = Literals (f a)
fmap f (Variables a) = Variables a
fmap f (UnaryExpression a b) = UnaryExpression a (fmap f b)
fmap f (BinaryExpression a b c) = BinaryExpression a (fmap f b) (fmap f c)
fmap f (ListExpression a b) = ListExpression a (fmap (fmap f) b)
接下來,您只需要一個函式來檢查它的引數是否等于a:如果是,則回傳b;否則回傳引數。
changeData a b c = fmap (\x -> if x == a then b else x) c
的定義fmap已經處理了每個資料建構式Expression;該函式只需要關心從一個Literals值中提取的值。(也就是說,f只應用于一個值中的一個Literals值;否則,它只是fmap遞回 ped 直到它到達 a Literals。)
uj5u.com熱心網友回復:
您可以讓 Haskell使用GHC 擴展為Functor型別類派生實體:DeriveFunctor
{-# LANGUAGE DeriveFunctor #-}
data Expressions a
= ListExpression String [Expressions a]
| BinaryExpression String (Expressions a) (Expressions a)
| UnaryExpression String (Expressions a)
| Variables Variable
| Literals a
deriving (Eq, Functor)
GHC 將生成一個Functor實體,通過在這些項上呼叫函子函式a來將型別項映射到型別b,并且它將遞回運算式a以映射a包含在這些子運算式中的項。
然后你可以使用fmap的changeData為@chepner說有:
changeData :: Eq a => a -> a -> Expressions a -> Expressions a
changeData a b = fmap (\x -> x == a then b else x)
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/387018.html
標籤:哈斯克尔
