gpt4 book ai didi

haskell - 我可以在 Haskell 中打印多态函数的类型,就像我将一个具体类型的实体传递给它一样吗?

转载 作者:行者123 更新时间:2023-12-04 18:10:55 25 4
gpt4 key购买 nike

这是一个具有 3 种类型的多态函数:

:t (.)
(.) :: (b -> c) -> (a -> b) -> a -> c
这里是一个非多态函数:
:t Data.Char.digitToInt
Data.Char.digitToInt :: Char -> Int
如果我们将前者应用于后者,我们会得到一个多态的 1 类型函数:
:t (.) Data.Char.digitToInt
(.) Data.Char.digitToInt :: (a -> Char) -> a -> Int
这意味着 (.)被“实例化”(我不确定这是正确的术语;作为 C++ 程序员,我会这样称呼它)与 b === Charc === Int ,所以 (.) 的签名应用于 digitToInt以下是
(Char -> Int) -> (a -> Char) -> a -> Int
我的问题是:根据 (.),有没有办法在屏幕上打印这个签名? , digitToInt以及我想将前者应用于后者的“信息”?
对于有兴趣的人,这个问题早些时候作为 this one 的副本关闭了。 .

最佳答案

Prelude 的一角隐藏着这个巧妙的小功能:

Prelude.asTypeOf :: a -> a -> a
asTypeOf x _ = x
它被记录为“强制其第一个参数与第二个参数具有相同的类型”。我们可以使用它来强制 (.) 的类型的第一个论点:
-- (.) = \x -> (.) x = \x -> (.) $ x `asTypeOf` Data.Char.digitToInt
-- eta expansion followed by definition of asTypeOf
-- the RHS is just (.), but restricted to arguments with the same type as digitToInt
-- "what is the type of (.) when the first argument is (of the same type as) digitToInt?"
ghci> :t \x -> (.) $ x `asTypeOf` Data.Char.digitToInt
\x -> (.) $ x `asTypeOf` Data.Char.digitToInt
:: (Char -> Int) -> (a -> Char) -> a -> Int
当然,这适用于您需要的任意数量的参数。
ghci> :t \x y -> (x `asTypeOf` Data.Char.digitToInt) . (y `asTypeOf` head)
\x y -> (x `asTypeOf` Data.Char.digitToInt) . (y `asTypeOf` head)
:: (Char -> Int) -> ([Char] -> Char) -> [Char] -> Int
您可以在评论中认为这是@K.A.Buhr 想法的一种变体——使用签名比其实现更严格的函数来指导类型推断——除非我们不必自己定义任何东西,代价是无法定义只需在 lambda 下复制有问题的表达式。

关于haskell - 我可以在 Haskell 中打印多态函数的类型,就像我将一个具体类型的实体传递给它一样吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65258061/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com