簡體   English   中英

嘗試在Haskell中定義自定義綁定運算符時出錯

[英]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值。你也可以談論MaybeMonad實例的定義,並查看它是如何實現的,或者甚至自己定義它,只要你確保在嘗試定義時沒有它在范圍內它通過執行下列操作之一:隱藏默認Maybe在前奏,不導入的前奏,或命名的版本, Maybe別的東西,像MyMaybe

所以,我建議首先要了解這三件事之間的區別。 有了這些知識,請閱讀我給你的兩個參考文獻,然后閱讀使用類型類的代碼,然后閱讀一些使用Monad實例的代碼 - 為幾種不同的類型提供直覺,然后繼續重新實現前奏Monad或者兩個你自己,然后最終嘗試創建你自己的Monad類型類的版本,而不是看前序,所以你可以測試自己對函數的理解。 然后你會非常了解他們:)

另外值得注意的是,在你到達Monad之前解決類型的問題可能是一個好主意。 你可能不得不這樣做,但他們是FunctorApplicative ,然后是Monad 您可以選擇在Functor之前添加SemigroupMonoid ,但這只是為了讓您更多地了解類型類,而不是理解Monad類型類的必要性。

祝好運!

暫無
暫無

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

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