簡體   English   中英

Haskell“不”類型約束

[英]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.

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