我試圖理解 Monads,我做了一個練習題:對于這個問題,我做了兩件事,接受一個函式和一個整數,然后我以以下方式處理它:我取 int 提供的值,然后像拆分整數一樣所以:
3 -> (2,1) (1,2)
4 -> (3,1) (2,2) (1,3)
so on.
其作業原理如下:
numberSplit :: Int -> [(Int,Int)]
numberSplit 0 = []
numberSplit 1 = []
numberSplit n = numberSplitHelper 1 (n - 1)
--Helper functions --
numberSplitHelper :: Int -> Int -> [(Int, Int)]
numberSplitHelper 0 0 = []
numberSplitHelper 0 1 = []
numberSplitHelper 1 0 = []
numberSplitHelper 1 1 = [(1, 1)]
numberSplitHelper n 1 = [(n, 1)]
numberSplitHelper n m = (n, m) : numberSplitHelper (n 1) (m - 1)
后記我將遞回地將該函式應用于從 numberSplit 函式回傳的串列中的每個值,并且我正在嘗試使用 monad 作為 monad 的練習。例如,如果我輸入:
(sort
(andExpressionsAtSize
(\ i -> if i == 1 then
[EBase True,EBase False]
else if i == 2 then
[ENot (EBase True),ENot (EBase False)]
else [])
3))
我的預期輸出是:
[EAnd (EBase False,EBase False)
,EAnd (EBase False,EBase True)
,EAnd (EBase True,EBase False)
,EAnd (EBase True, EBase True)]
我試圖做以下事情:
andExpressionsAtSize :: (Int -> [Expression]) -> Int -> [Expression]
andExpressionsAtSize f 0 = []
andExpressionsAtSize f n = do
intList <- numberSplit n
intList >>= f
它給了我以下錯誤:
Couldn't match type ‘(,) Int’ with ‘[]’
Expected: [Expression]
Actual: (Int, Expression)
根據我對 List Monad 的理解,它執行以下操作:
1. It takes in a list.
2. Applies the function on the left hand side to the list recursively.
所以它會將 f 一直應用到頭部到尾部。所以基于這樣的理解
intList >>= f
應該回傳一種它沒有的 [Expression] 型別,這讓我感到困惑,有人可以澄清發生了什么嗎?
編輯:有些人指出我從未使用過 EAnd,我忘了提到在輸出中每個元素都應該由 EAnd 連接。
uj5u.com熱心網友回復:
intList不是一個串列,正如它的名字所暗示的那樣!在片段中
do
{- ... -}
x <- y
{- here -}
如果y是一個串列,那么x將是串列中的元素之一標記的延續here。你寫:
do
intList <- numberSplit n
{- ... -}
由于numberSplit n是一個串列,intList因此將是該串列的成員——即一對 type (Int, Int)。
(我相信這是您的核心困惑,一旦糾正,您將對嘗試修復代碼的其余部分有一些想法;但如果這種想法不正確,請談談我哪里出錯了,我會嘗試進一步幫助。)
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/517668.html
標籤:哈斯克尔
