簡體   English   中英

Haskell應用函子-編譯失敗

[英]Haskell applicative functor - compilation failure

我試圖通過應用仿函數模式將函數鏈接在一起,但是在編譯代碼時遇到問題:

import Control.Applicative

buildMyList :: Float -> Float -> [Float]
buildMyList ul tick = [p | p <- [0,tick..ul]]

myFunctionChain :: [Float]
myFunctionChain = reverse <$> buildMyList 100 1

當我嘗試對此進行編譯時,出現以下編譯錯誤:

Couldn't match type 'Float' with '[a0]'
Expected type: [[a0]]
  Actual type: [Float]
In the return type of call of 'buildMyList'

在我看來,我沒有設法使期望的返回上下文與實際上下文匹配。 在這方面沒有足夠的經驗,我無法再進一步了!

使用bulldMyList可以更好地解釋該Applicative 假設您要構建一個方陣數組: [(0,0), (0,1), (0,2), (1, 0) ...] 使用列表推導:

buildMyMatrix :: Int -> Int -> [(Int, Int)]
buildMyMatrix maxX maxY = [(x, y) | x <- [0..maxX], y <- [0..maxY]]

使用應用組合器,可以將其重寫為:

buildMyMatrix maxX maxY = pure (\x y -> (x, y)) <*> [0..maxX] <*> [0..maxY]

根據適用法律,我們可以針對所有fx重寫pure f <*> x = f <$> x x

buildMyMatrix maxX maxY = (\x y -> (x, y)) <$> [0..maxX] <*> [0..maxY]

我不得不使用稍微復雜一些的buildMyMatrix ,因為您的buildMyList太瑣碎而無法從Applicative中受益:

buildMyList :: Float -> Float -> [Float]
buildMyList ul tick = [p | p <- [0,tick..ul]]
buildMyList ul tick = id <$> [0,tick..ul] -- [by functor identity law]:
buildMyList ul tick = [0,tick..ul]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM