我在下面提供了一些代碼來演示專案的基本概念。我有設定為介面的模塊;我實作了構建模塊的介面。在下面的示例中,我構建了一個Alpha.
type Ticker = String
type Shares = Int
type Price = Float
data Insight = Down | Flat | Up deriving (Show, Eq, Ord)
type Target = Float
data Universe = Universe {generateUniverse :: [(Ticker, Price)] -> [(Ticker, Price)]}
data Alpha = Alpha {generateInsights :: [(Ticker, Price)] -> [(Ticker, Insight)]}
data Portfolio = Portfolio {generateTargets :: [(Ticker, Insight)] -> [(Ticker, Target)]}
data Execution = Execution {generateOrders :: [(Ticker, Price)] -> [(Ticker, Target)] -> [(Ticker, Shares)]}
convert :: (Ticker, Price) -> (Ticker, Insight)
convert (t, p)
| p < 500 = (t, Down)
| p == 500 = (t, Flat)
| p > 500 = (t, Up)
split :: [(Ticker, Price)] -> [(Ticker, Insight)]
split xs = foldr (\tp acc -> (convert tp):acc) [] xs
splitAlpha :: Alpha
splitAlpha = Alpha {
generateInsights = split
}
main :: IO ()
main = do
let
alpha = splitAlpha
print (generateInsights alpha [("TSLA", 500.0), ("RKT", 10.0), ("AMC", 750)])
如何壓縮我的定義,splitAlpha以便在定義中沒有那么多嵌套generateInsights?我嘗試了下面的示例...
convert :: (Ticker, Price) -> (Ticker, Insight)
convert (t, p)
| p < 500 = (t, Down)
| p == 500 = (t, Flat)
| p > 500 = (t, Up)
splitAlpha :: Alpha
splitAlpha = Alpha {
generateInsights xs = foldr (\tp acc -> (convert tp):acc) [] xs
}
并收到此錯誤:
ghci> :cmd return $ unlines [":l itk", ":main"]
[1 of 1] Compiling Main ( itk.hs, interpreted )
itk.hs:23:20: error: parse error on input `xs'
|
23 | generateInsights xs = foldr (\tp acc -> (convert tp):acc) [] xs
| ^^
Failed, no modules loaded.
<interactive>:60:53: error:
* Variable not in scope: main :: IO a0
* Perhaps you meant `min' (imported from Prelude)
uj5u.com熱心網友回復:
您可以使用 lambda 運算式,因此:
splitAlpha :: Alpha
splitAlpha = Alpha {
generateInsights = \xs -> foldr (\tp acc -> (convert tp):acc) [] xs
}
但是,在這種特定情況下,這只是一個映射函式,因此您可以使用:
splitAlpha :: Alpha
splitAlpha = Alpha {
generateInsights = map convert
}
uj5u.com熱心網友回復:
正如 Willem Van Onsem 所寫,這個例子非常簡單,因為整個事情歸結為generateInsights = map convert. 但更一般地說,這不會那么容易。Lambda 語法僅適用于沒有保護的單子句函式
splitAlpha = Alpha
{ generateInsights = \xs -> ...
}
更一般地說,您始終可以使用let適當的定義范圍,您可以在其中使用完整的語法在本地定義任何函式,但避免填充任何其他命名空間:
splitAlpha = Alpha
{ generateInsights
= let gi xs = foldr (\tp acc -> (convert tp):acc) [] xs
in gi
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/487871.html
標籤:哈斯克尔
上一篇:Haskell極慢的簡單復發
下一篇:Haskell拆分、插入和串列
