- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
这里的问题与
Haskell Input Return Tuple
我不知道我们如何将输入从monad IO传递到另一个函数,以便进行一些计算。
其实我想要的是
-- First Example
test = savefile investinput
-- Second Example
maxinvest :: a
maxinvest = liftM maximuminvest maxinvestinput
maxinvestinput :: IO()
maxinvestinput = do
str <- readFile "C:\\Invest.txt"
let cont = words str
let mytuple = converttuple cont
let myint = getint mytuple
putStrLn ""
-- Convert to Tuple
converttuple :: [String] -> [(String, Integer)]
converttuple [] = []
converttuple (x:y:z) = (x, read y):converttuple z
-- Get Integer
getint :: [(String, Integer)] -> [Integer]
getint [] = []
getint (x:xs) = snd (x) : getint xs
-- Search Maximum Invest
maximuminvest :: (Ord a) => [a] -> a
maximuminvest [] = error "Empty Invest Amount List"
maximuminvest [x] = x
maximuminvest (x:xs)
| x > maxTail = x
| otherwise = maxTail
where maxTail = maximuminvest xs
最佳答案
首先,我认为您在理解Haskell时遇到一些基本问题,因此让我们逐步进行构建。希望对您有所帮助。其中一些只会到达您拥有的代码,而某些不会到达您的代码,但这是我编写此代码时考虑的慢速版本。之后,我将尝试回答您的一个特定问题。
我不太确定您要让程序做什么。我知道您想要一个程序来读取包含人员及其投资清单的文件作为输入。但是,我不确定您要使用它做什么。您似乎(a)想要一个合理的数据结构([(String,Integer)]
),但是(b)仅使用整数,因此我假设您也想对字符串做一些事情。让我们来看一下。首先,您需要一个函数,该函数可以在给定整数列表的情况下返回最大值。您将其称为maximuminvest
,但是此功能更一般,仅用于投资,所以为什么不将其称为maximum
呢?事实证明,该功能已经存在。你怎么知道我推荐Hoogle-这是一个Haskell搜索引擎,可让您搜索函数名称和类型。您需要一个从整数列表到单个整数的函数,所以让我们为search for that。事实证明,第一个结果是maximum
,它是您想要的更通用的版本。但是出于学习目的,让我们假设您想自己编写它;在这种情况下,您的实现就可以了。
好了,现在我们可以计算最大值了。但是首先,我们需要构建列表。我们将需要一种[String] -> [(String,Integer)]
类型的函数,以将我们的无格式列表转换为明智的列表。好吧,要从字符串中获取整数,我们需要使用read
。长话短说,尽管我会(a)为单项列表添加error
大小写(或者,如果我感觉很好,只是让它返回一个空列表以忽略最后一项),那么您当前的实现也可以(b)使用带有大写字母的名称,因此我可以将单词分开(可能使用不同的名称):
tupledInvestors :: [String] -> [(String, Integer)]
tupledInvestors [] = []
tupledInvestors [_] = error "tupledInvestors: Odd-length list"
tupledInvestors (name:amt:rest) = (name, read amt) : tupledInvestors rest
maxInvestment :: [String] -> Integer
。唯一缺少的是从元组列表到整数列表的功能。有几种解决方法。一个就是您拥有的一个,尽管这在Haskell中并不常见。第二个是使用
map :: (a -> b) -> [a] -> [b]
。这是将功能应用于列表的每个元素的功能。因此,您的
getint
等效于更简单的
map snd
。最好的方法可能是使用
Data.List.maximumBy :: :: (a -> a -> Ordering) -> [a] -> a
。这类似于
maximum
,但是它允许您使用自己的比较功能。并且使用
Data.Ord.comparing :: Ord a => (b -> a) -> b -> b -> Ordering
,事情变得很好。通过此功能,您可以将两个任意对象转换为可以比较的对象,从而比较它们。因此,我会写
maxInvestment :: [String] -> Integer
maxInvestment = maximumBy (comparing snd) . tupledInvestors
maxInvestment = maximum . map snd . tupledInvestors
。
main :: IO ()
main = do dataStr <- readFile "C:\\Invest.txt"
let maxInv = maxInvestment $ words dataStr
print maxInv
$
运算符,它只是函数应用程序,但是具有更方便的优先级;它具有
(a -> b) -> a -> b
类型,这应该是有道理的。)但是
let maxInv
似乎毫无意义,因此我们可以摆脱这一点:
main :: IO ()
main = do dataStr <- readFile "C:\\Invest.txt"
print . maxInvestment $ words dataStr
.
(如果您还没有看到的话)是函数组合。
f . g
与
\x -> f (g x)
相同。 (它的类型为
(b -> c) -> (a -> b) -> a -> c
,在某种程度上应该是有道理的。)因此,
f . g $ h x
与
f (g (h x))
相同,但更易于阅读。
let
了。那
<-
呢?为此,我们可以使用
=<< :: Monad m => (a -> m b) -> m a -> m b
运算符。请注意,这几乎类似于
$
,但
m
几乎污染了所有内容。这使我们可以获取一个Monadic值(此处为
readFile "C:\\Invest.txt" :: IO String
),并将其传递给一个将普通值转换为Monadic值的函数,并获得该Monadic值。因此,我们有
main :: IO ()
main = print . maxInvestment . words =<< readFile "C:\\Invest.txt"
=<<
视为单子(monad)
$
。
testfile
发生了什么;如果您编辑问题以反映该问题,我将尝试更新我的答案。
f :: a -> b
和一些monadic值
m :: IO a
。您想使用
f
来获取
b
类型的值。正如我在
my answer to your other question中解释的那样,这是不可能的。但是,您可以得到
IO b
类型的东西。因此,您需要一个函数,该函数接受
f
并给您单子(monad)版本。换句话说,类型为
Monad m => (a -> b) -> (m a -> m b)
的东西。如果我们
plug that into Hoogle,则第一个结果是
Control.Monad.liftM
,它具有该类型签名。因此,您可以将
liftM
视为与
$
略有不同的“monadic
=<<
”:
f `liftM` m
将
f
应用于
m
的纯结果(根据您所使用的monad),并返回monadic结果。不同之处在于
liftM
在左侧采用了纯函数,而
=<<
采用了部分单子(monad)函数。
do
-notation:
do x <- m
return $ f x
x
中取出
m
,对其应用
f
,然后将结果提升回monad。”这与
return . f =<< m
语句相同,再次是
liftM
。首先
f
执行一次纯计算;其结果被传递到
return
(通过
.
),这将纯净值提升到monad中;然后通过
=<,
将此部分monadic函数应用于
m
。
关于function - Haskell IO传递给另一个功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3067786/
main.cpp #include "Primes.h" #include int main(){ std::string choose; int num1, num2; w
似乎函数 qwertyInches() 应该可以工作但是当我在 main() 中调用它时它给了我 [Error] called object 'qwertyInches' is not a funct
我无法理解 C++ 语法的工作原理。 #include using namespace std; class Accumulator{ private: int value; public:
在 类中声明 函数成员时,我们可以同时执行这两种操作; Function first; Function() second; 它们之间有什么区别? 最佳答案 Function 代表任意函数: void
“colonna”怎么可能是一个简单的字符串: $('td.' + colonna).css('background-color','#ffddaa'); 可以正确突出显示有趣单元格的背景,并且: $
我正在尝试将网页中的动态参数中继到函数中,然后函数将它们传递给函数内部的调用。比如下面这个简化的代码片段,现在这样,直接传入参数是没有问题的。但是,如何在不为每个可能的 colorbox 参数设置 s
C++ 中是否有一种模式允许您返回一个函数,它返回一个函数本身。例如 std::function func = ...; do { func = func(); } while (func);
我正在将 Windows 程序集移植到 Linux。我有一些代码要移植。我实际上是 linux 中 C 的新手。我知道 C 基础知识是一样的! typedef struct sReader {
我一直在寻找一个很好的解释,所以我很清楚。示例: this.onDeleteHandler(index)}/> 对比 对比 this.nameChangedhandler(event, perso
function(){}.__proto__ === Function.prototype 和 Function.prototype === function(){}.__proto__ 得到不同的结
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function 据说 Propert
VBA 中的函数没有特殊类型。我很难理解如何在 Excel VBA 中将函数作为参数添加到函数中。 我想要完成的是这样的事情: function f(g as function, x as strin
所以我正在尝试制作一个包(我没有在下面包含我的 roxygen2 header ): 我有这个功能: date_from_text % dplyr::mutate(!!name := lubr
尝试从 std::function 派生一个类,对于初学者来说,继承构造函数。这是我的猜测: #include #include using namespace std; template cla
我正在尝试编写一个返回另一个函数的函数。我的目标是编写一个函数,它接受一个对象并返回另一个函数“search”。当我使用键调用搜索函数时,我想从第一个函数中给定的对象返回该键的值。 propertyO
我非常清楚函数式编程技术和命令式编程技术之间的区别。但是现在有一种普遍的趋势是谈论“函数式语言”,这确实让我感到困惑。 当然,像 Haskell 这样的一些语言比 C 等其他语言更欢迎函数式编程。但即
关闭。这个问题是opinion-based 。目前不接受答案。 想要改进这个问题吗?更新问题,以便 editing this post 可以用事实和引文来回答它。 . 已关闭 8 年前。 Improv
我在stackoverflow上查过很多类似的问题,比如call.call 1 , call.call 2 ,但我是新人,无法发表任何评论。我希望我能找到关于 JavaScript 解释器如何执行这些
向 Twilio 发送 SMS 时,Twilio 会向指定的 URL 发送多个请求,以通过 Webhook 提供该 SMS 传送的状态。我想让这个回调异步,所以我开发了一个 Cloud Functio
作为 IaC 的一部分,A 功能应用 ,让我们将其命名为 FuncAppX 是使用 Terraform 部署的,它有一个内置函数。 我需要使用 Terraform 在函数应用程序中访问相同函数的 Ur
我是一名优秀的程序员,十分优秀!