[英]Error trying to define custom bind operator in Haskell
所以我最近一直在研究monad,我對Haskell編程語言很陌生。
這是我的代碼:
import Data.List
import System.IO
f :: Int -> (Int, [Char])
f x = (x, ['a'])
g :: Int -> (Int, [Char])
g y = (y, ['b'])
(>>=) :: (Int -> (Int, [Char])) -> (Int -> (Int, [Char])) -> Int -> (Int, [Char])
(>>=) f1 f2 a = f1 (fst (f2 a))
h :: Int -> (Int, [Char])
h x = (>>=) g f x
GHCI編譯器顯示:錯誤:
Ambiguous occurrence `>>='
It could refer to either `Prelude.>>='
我究竟做錯了什么? 我是否以正確的方式使用monad?
您正在定義(>>=)
綁定,該綁定已經被前奏綁定(如上面的注釋中所指出的)。
因此,您需要消除對它的每個引用的歧義。
為您的模塊命名
module M where
然后,而不是寫作
h x = (>>=) g f x
使用其中之一
h x = (M.>>=) g f x
要么
h x = (Prelude.>>=) g f x
選擇你想要的版本>>=
。
但是 ,我認為這不是你真正想做的事情。 這個(>>=)
將是一個與Monad
類無關的綁定。
為了正確回答這個問題,我們必須檢查您的假設和實際知識是否與Haskell社區對此知識的定義相匹配。
所以,首先,你顯然明白了什么類型,似乎你理解多態類型相當好。
因為Monad
是一個類型類,並且類型類使用多態類型,並且因為類型類也可以使用代數數據類型 ,所以在嘗試理解Monad
之前確保你對這些事物有一個堅定的理解是個好主意。 類型類與其他語言中的接口非常相似 - 它們定義了一組特定類型類實例必須遵守的強制和可選函數(及其類型)。 通常,它們還為您提供“免費”功能以及其他功能的默認定義。 他們非常酷:)
有很多好的地方可以讓你很好地理解類型類。 我指的是http://www.happylearnhaskelltutorial.com/1/output_other_things.html作為一個簡單的介紹(完整的披露,我幫助寫了這個),以及類型詞典,它也將更多地解釋Monads (並提供必要的知識) https://wiki.haskell.org/Typeclassopedia
我還要提一下,如果你有錢,而你想進行長時間的練習來真正充實你的理解,請查看http://haskellbook.com - 它相當冗長,但對你來說可能非常有用,一般來說也是如此。讓您對Haskell的基礎知識有一個很好的理解。
非常重要的是要意識到使用 Monad
實例(前奏包含許多常見實例)和制作 Monad
實例之間存在很大差異,這就是您在上面嘗試做的事情。
然后,還有Monad
類型類本身的定義,通常在書中作為示例給出,它可以幫助您理解Monad
實例的工作原理。
最后你需要查看Monad
類型類中包含的函數的一般定義,以完全理解它是如何工作的,但是要理解這三個事物是完全獨立的,並且經常可以互換地描述為“Monad”,這是很好的。由人。 (例如,值Just 5
可以被描述為monadic值,但通常人們只會說它是monad,即使這在技術上是不正確的......因為Maybe
有一個為它定義的Monad
實例,而且Just 5
是一個Maybe
值。你也可以談論Maybe
的Monad
實例的定義,並查看它是如何實現的,或者甚至自己定義它,只要你確保在嘗試定義時沒有它在范圍內它通過執行下列操作之一:隱藏默認Maybe
在前奏,不導入的前奏,或命名的版本, Maybe
別的東西,像MyMaybe
。
所以,我建議首先要了解這三件事之間的區別。 有了這些知識,請閱讀我給你的兩個參考文獻,然后閱讀使用類型類的代碼,然后閱讀一些使用Monad
實例的代碼 - 為幾種不同的類型提供直覺,然后繼續重新實現前奏Monad
或者兩個你自己,然后最終嘗試創建你自己的Monad
類型類的版本,而不是看前序,所以你可以測試自己對函數的理解。 然后你會非常了解他們:)
另外值得注意的是,在你到達Monad
之前解決類型的問題可能是一個好主意。 你可能不得不這樣做,但他們是Functor
, Applicative
,然后是Monad
。 您可以選擇在Functor
之前添加Semigroup
和Monoid
,但這只是為了讓您更多地了解類型類,而不是理解Monad
類型類的必要性。
祝好運!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.