小编jsm*_*mrt的帖子

Haskell中的运算符和函数优先级

所以这不起作用:

take 50 iterate (* 2) 1
Run Code Online (Sandbox Code Playgroud)

因为它需要在第二个参数中使用括号.我的问题是为什么.

Haskell理所当然地看到了类型的差异:

 Couldn't match expected type `[a0]'
            with actual type (a1 -> a1) -> a1 -> [a1]'
Run Code Online (Sandbox Code Playgroud)

我的问题是:

1)似乎haskell首先尝试在迭代函数之前解析take 50函数.为什么haskell会这样做?在数学中,如果你有fgtwu(x),你首先评估你(x)然后再做其他事情.为什么haskell在这种情况下开始评估f?

2)Haskell足够聪明,可以检测出实际类型是:

(a1 -> a1) -> a1 -> [a1]
Run Code Online (Sandbox Code Playgroud)

现在,如果它看到这个函数的输出是[a1],一个与预期类型[a0]统一的类型,为什么haskell不统一呢?

3)为什么$运营商会解决这个问题?我知道:

($) :: (a -> b) -> a -> b
Run Code Online (Sandbox Code Playgroud)

所以这个操作符的基本操作就是"写FUNCTION $ ARGUMENT"并获得在该参数中计算的函数的值.在take 50案例中,类型是:

take 50 :: [a2]->[a2]
take 50 $ :: a->b 
where a ~a2 and b~b2 then
take 50 $ :: [a2]->[a2]
Run Code Online (Sandbox Code Playgroud)

因此,基本上我处于与第一种情况相同的情况,不使用括号或$.这种情况是我需要一个类型[a2]的参数(haskell称之为[a0]但它是相同的.所以..为什么haskell统一[a2]与(a1 - > a1) - > a1 - > [a1]当我使用$但它没有当我不使用它?

haskell function infix-notation operator-precedence operator-keyword

2
推荐指数
2
解决办法
797
查看次数

从函数定义Haskell中推断函数类型

所以我正在对Haskell进行测试,一个问题说:

让功能成为

lolo g x = ys
      where ys = [x] ++ filter (curry g x) ys
Run Code Online (Sandbox Code Playgroud)

然后确定名为lolo的函数的类型.选项是:

a) (a,b) -> Bool -> b -> [(a,b)]
b) (b -> b -> b) -> Bool -> [b]
c) ((b,b) -> Bool) -> b -> [b]
d) (a -> b -> Bool) -> b -> [c]
Run Code Online (Sandbox Code Playgroud)

有人可以解释它是哪一个,为什么?我真的很困惑这个......我不明白的是:

1)咖喱功能只适用于功能吗?不是可能是元组的数据类型?那么你可以推断出g在这种情况下是一个函数吗?如果g和x都是函数怎么办?是否有可能使用咖喱与第n个参数?我只看到咖喱与1参数一起使用.

2)我不太了解的另一件事是ys定义中的递归.所以ys是由ys定义的,但是在这种情况下我没有看到基本情况.它会永远结束吗?也许是过滤函数使递归结束.

3)还在咖喱gx =咖喱(gx)对吧?(这是关于功能应用优先级的问题)

非常感谢

haskell types function filter currying

1
推荐指数
1
解决办法
109
查看次数

奇怪的行为GHCi Haskell编译器

在测试中,我被要求推断出以下类型:

let pr = map head.group.sortBy(flip compare)
Run Code Online (Sandbox Code Playgroud)

我自己推断出类型是:

Ord a => [a] -> [a]
Run Code Online (Sandbox Code Playgroud)

但是,当:t在GHCi中进行时,它表示类型是:

pr :: [()] -> [()]
Run Code Online (Sandbox Code Playgroud)

到底是怎么回事?

如果在GHCi我也这样做:

map head.group.sortBy(flip compare) [1,2,3,4,100,50,30,25,51,70,61]
Run Code Online (Sandbox Code Playgroud)

我收到一个错误:

 Couldn't match expected type `a0 -> [b0]' with actual type `[a1]'
In the return type of a call of `sortBy'
Probable cause: `sortBy' is applied to too many arguments
In the second argument of `(.)', namely
  `sortBy (flip compare) [1, 2, 3, 4, ....]'
In the second argument of `(.)', namely …
Run Code Online (Sandbox Code Playgroud)

haskell types ghci

1
推荐指数
1
解决办法
135
查看次数

在Haskell中定义由已知类型组成的新类型

假设我想定义一个带有int和string的新类型.我知道要这样定义:

data Comp = Comp Int String

但这种表示法的问题是,当我有这种类型的实例时,实例的形式为:

Comp 45 "heloWorld"

我不希望这样,我想要数据类型的这些"参数"(更像是记录的条目),我希望它们以字符分隔,例如| 或#而不是空格.我不希望那个角色做任何事情,这只是我想要使用的符号.在这种情况下, 45#"hii" 是我想要的而不是 45 "hii".为了做到这一点,我如何调整数据类型的定义?我打算为此数据类型重载运算符,例如: 45#"kkk" + 128#"a"应该是一个有效的操作.

haskell types overloading

0
推荐指数
1
解决办法
110
查看次数