小编jak*_*man的帖子

Haskell类型令人沮丧,简单的"平均"功能

我正在和初学者Haskell一起玩,我想写一个普通的函数.这似乎是世界上最简单的事情,对吧?

错误.

似乎Haskell的类型系统禁止平均处理泛型数字类型 - 我可以使它在Integrals列表或Fractionals列表上工作,但不能同时工作.

我想要:

average :: (Num a, Fractional b) => [a] -> b
average xs = ...
Run Code Online (Sandbox Code Playgroud)

但我只能得到:

averageInt :: (Integral a, Fractional b) => [a] -> b
averageInt xs = fromIntegral (sum xs) / fromIntegral (length xs)
Run Code Online (Sandbox Code Playgroud)

要么

averageFrac :: (Fractional a) => [a] -> a
averageFrac xs = sum xs / fromIntegral (length xs)
Run Code Online (Sandbox Code Playgroud)

而第二个似乎工作.直到我尝试传递变量.

*Main> averageFrac [1,2,3]
2.0
*Main> let x = [1,2,3]
*Main> :t x
x :: [Integer]
*Main> averageFrac x

<interactive>:1:0:
    No …
Run Code Online (Sandbox Code Playgroud)

haskell types typeclass

68
推荐指数
3
解决办法
3万
查看次数

END块中的本地($?) - 为什么分配给它的值是多少?

在工作中,我们在与对象的析构函数中的子进程交互时遇到错误,并最终将其追踪到$?在等待调用期间被覆盖的变量.这是在调用exit()之后发生的,所以$?另外还意味着我们程序的返回代码到操作系统.

具体来说,perldoc谈到了这种错误:

在END子程序里面$?包含将给予exit()的值.你可以修改$?在END子例程中更改程序的退出状态.

我们不希望发生这种情况,因此我们将local $?=$?;每个END块放在内部.但是现在程序将成功归功于操作系统,而实际上却失败了.

我设法将其分解为两个示例程序.一个按预期工作,一个失败.对于x86_64-linux-thread-multi,这在v5.8.8和v5.10.1上都会发生

程序A :(返回0到操作系统)

END{ local $?=$?; }
exit(100);
Run Code Online (Sandbox Code Playgroud)

程序B :(返回100到操作系统)

END{ local $?=$?>>8; }
exit(100);
Run Code Online (Sandbox Code Playgroud)

为什么local $?在最终块中分配了什么值?

perl subroutine

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

标签 统计

haskell ×1

perl ×1

subroutine ×1

typeclass ×1

types ×1