所以这不起作用:
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
所以我正在对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)对吧?(这是关于功能应用优先级的问题)
非常感谢
在测试中,我被要求推断出以下类型:
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) 假设我想定义一个带有int和string的新类型.我知道要这样定义:
data Comp = Comp Int String
但这种表示法的问题是,当我有这种类型的实例时,实例的形式为:
Comp 45 "heloWorld"
我不希望这样,我想要数据类型的这些"参数"(更像是记录的条目),我希望它们以字符分隔,例如| 或#而不是空格.我不希望那个角色做任何事情,这只是我想要使用的符号.在这种情况下,
45#"hii"
是我想要的而不是
45 "hii".为了做到这一点,我如何调整数据类型的定义?我打算为此数据类型重载运算符,例如:
45#"kkk" + 128#"a"应该是一个有效的操作.