gpt4 book ai didi

haskell - 了解函数类型

转载 作者:行者123 更新时间:2023-12-03 12:59:27 25 4
gpt4 key购买 nike

我在尝试理解 Haskell 如何确定函数类型时有点困惑。下面是一个例子:

boolFcn x y = x/=3 && y/=4

当我检查上述函数的类型时,它给了我结果:
(Num a1, Num a, Eq a1, Eq a) => a -> a1 -> Bool

这是另一个例子:
triangles = [ (a,b,c) | c <- [1..10], b <- [1..10], a <- [1..10] ]   

和应用 :ttriangles结果为:
(Num t2, Num t1, Num t, Enum t2, Enum t1, Enum t) =>  [(t, t1, t2)]

我脑子里出现了几个问题,我自己很难解决:
  • 为什么boolFcn的类型由a, a1组成文字,而三角形的类型由 t,t1 组成文字? a有什么区别吗和 t ?
  • 为什么这个 boolFcn 的类型不能简化为:
    (Num a, Eq a) => a -> a -> Bool
  • aa1具有相同的类型类,那么为什么我不能简单地使用一个 a 来编写它们? ?当我检查函数的类型时:
    let sumthis x y = if x > y then x+y else x-y

    我得到一个结果:
    (Ord a, Num a) => a -> a -> a

    为什么它不会导致:
    (Ord a, Num a, Ord a1, Num a1) => a -> a1 -> a

    如果问题微不足道,我很抱歉,尽管我很乐意听到对此问题的任何解释/提示。

    最佳答案

  • 是的,at在这些示例中基本相同。差异只是类型推断算法的副作用。
  • 嗯,在 boolFcn , (Num a, Eq a) => a -> a -> Bool不够通用,因为前两个参数不需要是相同的类型。考虑以下调用:
    boolFcn (4::Int) (4::Double)
    这是有效的,因为 IntDouble都是Num的成员和 Eq类型类,但它们显然不是同一类型。在您的 sumthis例如,xy必须是相同类型,因为它们用作需要相同类型参数的函数的输入。

    我们可以通过查看 :t (+) 看到这一点。 ,返回 (+) :: Num a => a -> a -> a .自+的参数必须是同一类型,xy必须是相同的类型,所以 sumthis必须需要相同类型的参数。所以
    sumthis (4::Int) (4::Double)
    将无效。
  • 关于haskell - 了解函数类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24535729/

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