函數類型我想有一個確定一個類型是函數類型,這樣的功能:測試如果一個類型是伊德里斯
isFunction : Type -> Bool
isFunction (a -> b) = True
isFunction _ = False
這將返回True
對所有輸入,但是。我該如何做這項工作?
函數類型我想有一個確定一個類型是函數類型,這樣的功能:測試如果一個類型是伊德里斯
isFunction : Type -> Bool
isFunction (a -> b) = True
isFunction _ = False
這將返回True
對所有輸入,但是。我該如何做這項工作?
匹配類型被稱爲型套管。能夠做到這一點將打破稱爲參數這是非常有價值的概念。
https://stackoverflow.com/a/23224110/108359
伊德里斯不支持類型套管。我認爲它可能在一個階段嘗試過,但人們很快就放棄了。它也用於在嘗試輸入外殼時給出錯誤,但檢查導致錯誤,因此現在已被禁用。
雖然您不會再有錯誤,但不能提供Type -> Bool
的實施,它們的工作方式與const True
或const False
不同。
對不起,這個功能是不可能的。這可能聽起來像是一個限制,但每次我都認爲我有一個類似於這個功能的動機時,我最終發現我可以用更明確的方式來構建我的程序。
這裏的問題是:你爲什麼需要這樣的東西?
您是否需要了解任意Idris類型是否爲函數?或者你只需要從Idris類型的特定子集中找到它呢? 我想不通的第一次一個可能的應用,但如果您需要:第二個,那麼你可以定義自己的嵌入式語言處理值與這些類型的,像這樣:
data Ty = TyNat | TyString | TyFun Ty Ty | ...
isFunction : Ty -> Bool
isFunction (TyFun _ _) = True
isFunction _ = False
檢查關於如何實現這些類型的嵌入式語言的更多信息,請參閱以下講座: https://vimeo.com/61663317
以下是如何在[Haskell](http://ideone.com/d8y8q6)中執行此操作的方法。也許有可能適應伊德里斯,因爲它有類型類(但我不知道,它們的表現力如何)。你需要'isFunction'進行arity-generic編程嗎?編寫一個arity-generic函數的標準方法是明確地傳遞arity,以便可以從中計算簽名。你可以閱讀更多[這裏](http://stackoverflow.com/a/25417600/3237465)。 – user3237465
@ user3237465:理想情況下,我希望能夠編寫'isFunction String'或'isFunction(String - > String)'而不是'isFunction「」'或'isFunction(++)'' – Adrian