[英]Haskell “not” type constraint
我試圖以歸納方式定義一對類實例。 那是:
class Foo a b | a -> b where
foo :: a -> b
instance (not?)Foo a => Bar a b
foo x = ...
instance Foo a => Bar a b
foo x = ...
第一個實例確定基本操作,秒遞歸調用foo。 有沒有辦法做到這一點? 一個很好的例子是扁平化列表,在第一種情況下它是標識函數,在第二種情況下它是concat的遞歸應用。
由於一個非常簡單的原因,沒有辦法直接執行此操作 - 實例選擇僅查看“head”,即=>
之后的部分。 您在上下文中沒有放置任何內容 - =>
之前的部分 - 可以影響選擇哪個實例。
對於簡單的情況,您通常可以完全避免該問題,例如,如果存在有限數量的“基本案例”類型。 一個常見的例子是類型級列表,其中你有一個Cons
的遞歸情況和Nil
的基本情況,就是這樣。
在一般情況下,您通常需要某種“條件測試”類型類,根據是否滿足某些條件來選擇類型,然后將實際實現交給“輔助”類,該類將條件的結果值作為參數並使用它來選擇實例。
這是一個flatten函數的實現 ,適用於任何級別的嵌套列表。 我不會真的推薦使用它 - 這里只是為了演示如何在haskell中實現這樣的功能。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.