【问题标题】:Haskell manual type inference of this function [closed]此函数的 Haskell 手动类型推断 [关闭]
【发布时间】:2018-06-26 23:23:08
【问题描述】:

谁能给我解释一下如何手动推断这个函数f的类型?

f = map (.) . (:) even

我想知道一步一步的解决方案,解释与优先级和东西相关的事情。

提前致谢!

【问题讨论】:

    标签: haskell type-inference


    【解决方案1】:

    步骤 1. 解析:

    f = (map (.)) . ((:) even)
    

    步骤 2. 推断一些类型:

    (.) :: (b -> c) -> (a -> b) -> (a -> c)
    map (.) :: [b -> c] -> [(a -> b) -> (a -> c)]
    (:) :: d -> [d] -> [d]
    (:) even :: Integral e => [e -> Bool] -> [e -> Bool]
    

    第 3 步。导出一些方程:

    x = [e -> Bool] -- the output of (:) even
    x = [b -> c] -- the input to map (.)
    e = b
    c = Bool
    

    第四步,写下f的类型:

    f :: [(a -> b) -> (a -> c)]
    f :: Integral e => [(a -> e) -> (a -> Bool)]
    

    【讨论】:

    • 非常感谢@DanRobertson 只有一件事,哪一个是用来解析表达式的标准?
    • 每个运算符都有定义的优先级和关联性。
    • @DanRobertson 运算符优先级和关联性在这里都无关紧要,因为只有一个运算符 .。起作用的规则只是“函数应用程序比任何运算符绑定得更紧密”。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-20
    相关资源
    最近更新 更多